1. 程式人生 > >equals == hashcode

equals == hashcode

1:equals方法                                                                                    
      Object類定義的equals方法用於判別某個指定的物件與當前物件 (呼叫 equals方法的物件)是否等價。在Java 語言中資料等價的基本含義是指兩個資料的值相等。 在 equals 和”==”進行比較的時候,引用型別資料比較的是引用,即記憶體地址,基本資料型別比較的是值。

1.1:equals方法與“==”運算子的關係
       equals()方法只能比較引用型別,"=="可以比較引用型別及基本型別;
特例:當用equals()方法進行比較時,對類 File、String、Date及包裝類來說,是比較型別及內容而不考慮引用的是否是同一個例項; 用"=="進行比較時,符號兩邊的資料型別必須一致(可自動轉換的資料型別除外),否則編譯出錯,而用equals方法比較的兩個資料只要都是引用型別即可。 

小結一下:
      在引用型別的比較上,Object裡面的 equals方法預設的比較方式,基本上等同於“==” ,都是比較記憶體地址,只有那幾個特殊的是比較的值。

2:hashCode 方法                                                                                    
      hashCode是按照一定的演算法得到的一個數值,是物件的雜湊碼值。主要用來在集合(後面會學到)中實現快速查詢等操作,也可以用於物件的比較。
     在Java 中,對hashCode的規定如下:
(1):在同一個應用程式執行期間,對同一個物件呼叫 hashCode(),必須返回相同的整數結果——前提是equals()所比較的資訊都不曾被改動過。 至於同一個應用程式在不同執
行期所得的呼叫結果,無需一致。 
(2):如果兩個物件被equals(Object)方法視為相等,那麼對這兩個物件呼叫hashCode()必須獲得相同的整數結果。 
(3):如果兩個物件被equals(Object) 方法視為不相等,那麼對這兩個物件呼叫 hashCode()不必產生不同的整數結果。然而程式設計師應該意識到,對不同物件產生不同的整數結
果,有可能提升hashTable(後面會學到,集合框架中的一個類) 的效率。 
 
小結一下:
     如果兩個物件相同,那麼它們的 hashCode 值一定要相同;如果兩個物件的hashCode相同,它們並不一定相同。 在Java 規範裡面規定,覆蓋equals方法應該連帶覆蓋 hashCode方法,這就涉及到一個如何實現hashCode方法的問題了。