1. Object類
java
在Java體系中,java.lang.Object類位於頂端(是全部對象的直接或間接父類)。若是一個類沒有寫extends關鍵字聲明其父類,則該類默認繼承java.lang.Object類。Object類定義了「對象」的基本行爲,被子類默認繼承。算法
1)toString方法:返回一個能夠表示該對象屬性內容的字符串。安全
MyObject obj=new MyObject(); // MyObject類自定義eclipse
String info=obj.toString(); ide
System.out.println(info);工具
A.上例MyObject 類沒有toString方法,對象也能調用toString()?性能
由於全部的類都繼承自Object,而toString方法是Ojbect定義的,咱們直接繼承了這個方法。Object的toString方法幫咱們返回一個字符串,這個字符串的格式是固定的:類型@hashcode,這個hashcode是一串數字,在java中叫句柄,或叫地址(但不是真實的物理地址,是java本身的一套虛擬地址,防止直接操做內存的)。this
public String toString(){ //只能用public,重寫的方法訪問權限要大於等於父類中方法的權限編碼
return "這個是咱們本身定義的toString方法的返回值MyObject!"; spa
}
B.爲何要重寫toString方法?
toString定義的原意是返回可以描述當前這個類的實例的一串文字,咱們看一串hashcode沒意義,因此是要重寫的。
2)equals方法:用於對象的「相等」邏輯。
A.在Object中的定義:
public boolean equals(Object obj){
return (this==obj);
}
因而可知,this==obj與直接的==(雙等於)效果同樣,僅僅是根據對象的地址(句柄,那個hashcode值)來判斷對象是否相等。所以想比較對象與給定對象內容是否一致,則必須重寫equals方法。
B.「==」與equals的區別:
用「==」比較對象時,描述的是兩個對象是否爲同一個對象!根據地址值判斷。而equals方法力圖去描述兩個對象的內容是否相等,內容相等取決於業務邏輯須要,能夠自行定義比較規則。
C.equals方法的重寫:如,判斷兩點是否相等。
public boolean equals(Object obj){
/* 注意參數,若給定的對象obj的地址和當前對象地址一致,那麼他們是同一個對象,
* equals方法中有大量的內容比較邏輯時,加上這個判斷會節省性能的開銷!
*/
if(this == obj){
return true;
}
/* equals比較前要進行安全驗證,確保給定的對象不是null!若obj是null,
* 說明該引用變量沒有指向任何對象,那麼就不能引用ojb所指象的對象(由於對象不存在)
* 的屬性和方法!若這麼作就會引起NullPointException,空指針異常!
*/
if(obj == null){
return false;
}
/* 直接將Object轉爲子類是存在風險的!咱們不能保證Object和咱們要比較的對象是
* 同一個類型的這會引起ClassCastException!咱們稱爲:類造型異常。
* 重寫equals時第一件要作的事情就是判斷給定的對象是否和當前對象爲同一個類型,
* 不是同類型直接返回false,由於不具有可比性!
*/
if( !(obj instanceof Point) ){
return false;
}
// 是同一類型,轉換
Point p=(Point)obj;
// 最後返回內容比較( 根據實際狀況決定 )
return this.x==p.x && this.y==p.y;
}
3)hashCode()方法(如下這段話是從別人帖子回覆拷貝過來的)
hashcode是用來查找的,例如內存中有這樣的位置: 0 1 2 3 4 5 6 7,而我有個類,這個類有個字段叫ID,我要把這個類存放在以上8個位置之一,若是不用hashcode而任意存放,那麼當查找時就須要到這八個位置裏挨個去找,或者用二分法一類的算法。但若是用hashcode那就會使效率提升不少。咱們這個類中有個字段叫ID,那麼咱們就定義咱們的hashcode爲ID%8,而後把咱們的類存放在取得得餘數那個位置。好比咱們的ID爲9,9除8的餘數爲1,那麼咱們就把該類存在1這個位置,若是ID是13,求得的餘數是5,那麼咱們就把該類放在5這個位置。這樣,之後在查找該類時就能夠經過ID除 8求餘數直接找到存放的位置了。
可是若是兩個類有相同的hashcode怎麼辦那(咱們假設上面的類的ID不是惟一的),例如9除以8和17除以8的餘數都是1,那麼這是否是合法的,回答是:能夠這樣。那麼如何判斷呢?在這個時候就須要定義 equals了。也就是說,咱們先經過 hashcode來判斷兩個類是否存放某個桶裏,但這個桶裏可能有不少類,那麼咱們就須要再經過 equals 來在這個桶裏找到咱們要的類。
那麼。重寫了equals(),爲何還要重寫hashCode()呢? 想一想,你要在一個桶裏找東西,你必須先要找到這個桶啊,你不經過重寫hashcode()來找到桶,光重寫equals()有什麼用啊。
4)編碼時候,能夠採用eclipse快捷工具生成對應的equals()和hashCode()方法。