天天看點

equal&==&hashcode

== 和 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中的位址,同==

上一篇: AngularJS 包含
下一篇: java的NIO和AIO