== 和 equals 的差別
Object類中的equals方法和“==”是一樣的,沒有差別,而String類,Integer類等等一些類,是重寫了equals方法,才使得equals和“==不同”,是以,當自己建立類時,自動繼承了Object的equals方法,要想實作不同的等于比較,必須重寫equals方法。
“==”比”equal”運作速度快,因為”==”隻是比較引用.
hashcode 和 equals 的具體實作方式
預設 equals 方法直接調用了 ==
public boolean equals(Object obj) { return (this == obj); }
String 改寫了 equals
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } return false; }
hashCode是根類Obeject中的方法。預設情況下,Object中的hashCode() 傳回對象的32位jvm記憶體位址。也就是說如果對象不重寫該方法,則傳回相應對象的32為JVM記憶體位址。
String類源碼中重寫的hashCode方法如下:
public int hashCode() { int h = hash; //Default to 0 ### String類中的私有變量, if (h == 0 && value.length > 0) { //private final char value[]; ### Sting類中儲存的字元串内容的的數組 char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h;
總結:
(1)綁定。當equals方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。
(2)綁定原因。Hashtable實作一個哈希表,為了成功地在哈希表中存儲和檢索對象,用作鍵的對象必須實作 hashCode 方法和 equals 方法。同(1),必須保證equals相等的對象,hashCode 也相等。因為哈希表通過hashCode檢索對象。
(3)預設。==預設比較對象在JVM中的位址。hashCode 預設傳回對象在JVM中的存儲位址。equal比較對象,預設也是比較對象在JVM中的位址,同==