天天看點

java中的==、equals()、hashCode()源碼分析

在java程式設計或者面試中經常會遇到 == 、equals()的比較。自己看了看源碼,結合實際的程式設計總結一下。

1. == 

  java中的==是比較兩個對象在JVM中的位址。比較好了解。看下面的代碼:

  上述代碼中:

  (1)s1 == s2為true,是因為s1和s2都是字元串字面值"nihao"的引用,指向同一塊位址,是以相等。

  (2)s1 == s3為false,是因為通過new産生的對象在堆中,s3是堆中變量的引用,而是s1是指向字元串字面值"nihao"的引用,位址不同是以不相等。

2.equals()

   equals是根類Obeject中的方法。源代碼如下:

  可見預設的equals方法,直接調用==,比較對象位址。

   不同的子類,可以重寫此方法,進行兩個對象的equals的判斷。

  String類源碼中重寫的equals方法如下,

  從上面的代碼中可以看到,

  (1)String類中的equals首先比較位址,如果是同一個對象的引用,可知對象相等,傳回true。

  (2)若果不是同一個對象,equals方法挨個比較兩個字元串對象内的字元,隻有完全相等才傳回true,否則傳回false。

3.hashcode()

  hashCode是根類Obeject中的方法。

  預設情況下,Object中的hashCode() 傳回對象的32位jvm記憶體位址。也就是說如果對象不重寫該方法,則傳回相應對象的32為JVM記憶體位址。

  String類源碼中重寫的hashCode方法如下,

  String源碼中使用private final char value[];儲存字元串内容,是以String是不可變的。

  看下面的例子,沒有重寫hashCode方法的類,直接傳回32位對象在JVM中的位址;Long類重寫了hashCode方法,傳回計算出的hashCode數值:

總結:

(1)綁定。當equals方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。

(2)綁定原因。Hashtable實作一個哈希表,為了成功地在哈希表中存儲和檢索對象,用作鍵的對象必須實作 <code>hashCode</code> 方法和 <code>equals</code> 方法。同(1),必須保證equals相等的對象,<code>hashCode</code> 也相等。因為哈希表通過hashCode檢索對象。

(3)預設。

  ==預設比較對象在JVM中的位址。

  hashCode 預設傳回對象在JVM中的存儲位址。

  equal比較對象,預設也是比較對象在JVM中的位址,同==

參考:

<a href="http://docs.oracle.com/javase/7/docs/api/">http://docs.oracle.com/javase/7/docs/api/</a>