String和equals()、hashCode()
阿新 • • 發佈:2019-02-14
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(),重新定義雜湊碼規範。