1. 程式人生 > >String和equals()、hashCode()

String和equals()、hashCode()

Object中的“==”,equal,hashCode()

Object中的==

  • 對於基本資料型別,“==”比較值是否相同。
  • 對於引用資料型別, “==”比較記憶體中的存放地址是否相同。

Object中的equals()

public boolean equals(Object o) {
    return this == o;
}

Object的equals()方法預設還是根據“==”比較,所以比較的還是記憶體地址。

Object中的hashCode()

public int hashCode() {
    int lockWord = shadow$_monitor_;
    final
int lockWordStateMask = 0xC0000000; // Top 2 bits. final int lockWordStateHash = 0x80000000; // Top 2 bits are value 2 (kStateHash). final int lockWordHashMask = 0x0FFFFFFF; // Low 28 bits. if ((lockWord & lockWordStateMask) == lockWordStateHash) { return lockWord & lockWordHashMask; } return
System.identityHashCode(this); }

Object中的hashCode()返回值是在JVM中的32位地址。

String類的“==”,equal,hashCode()

String類中對hashCode()和equals()都進行了重寫,所以呼叫String的equals()和hashCode()可能會和沒重寫這兩個方法的類產生不同的結果。

String的equals()

@Override
public boolean equals(Object other) {
    if (other == this) {
      return true
; } if (other instanceof String) { String s = (String)other; int count = this.count; if (s.count != count) { return false; } // TODO: we want to avoid many boundchecks in the loop below // for long Strings until we have array equality intrinsic. // Bad benchmarks just push .equals without first getting a // hashCode hit (unlike real world use in a Hashtable). Filter // out these long strings here. When we get the array equality // intrinsic then remove this use of hashCode. if (hashCode() != s.hashCode()) { return false; } for (int i = 0; i < count; ++i) { if (charAt(i) != s.charAt(i)) { return false; } } return true; } else { return false; } }

同樣是如果記憶體地址相同肯定內容也相同,返回true。
儲存地址不同,要滿足長度、hash碼、對應的字元都相同才能返回true。

String的hashCode()

@Override public int hashCode() {
    int hash = hashCode;
    if (hash == 0) {
        if (count == 0) {
            return 0;
        }
        for (int i = 0; i < count; ++i) {
            hash = 31 * hash + charAt(i);
        }
        hashCode = hash;
    }
    return hash;
}

根據String的成員變數hashCode和字串的內容生成hashcode。

總結:

預設情況下,==比較物件的儲存地址,hashCode返回的事物件的儲存地址。
equal比較物件,預設也是比較物件在JVM中的地址,同==
大多數類都根據自己的功能重寫了equals(),但一般重寫equals()就要覆蓋hashCode(),重新定義雜湊碼規範。