equals()和hashCode()隱式調(diào)用時的約定
來源:程序員人生 發(fā)布時間:2015-06-08 08:45:18 閱讀次數(shù):2434次

首先,我們來看1個問題.
-
import java.util.HashMap;
-
-
public class Apple {
-
private String color;
-
-
public Apple(String color) {
-
this.color = color;
-
}
-
-
public boolean equals(Object obj) {
-
if (!(obj instanceof Apple))
-
return false;
-
if (obj == this)
-
return true;
-
return this.color == ((Apple) obj).color;
-
}
-
-
public static void main(String[] args) {
-
Apple a1 = new Apple("green");
-
Apple a2 = new Apple("red");
-
-
-
HashMap<Apple, Integer> m = new HashMap<Apple, Integer>();
-
m.put(a1, 10);
-
m.put(a2, 20);
-
System.out.println(m.get(new Apple("green")));
-
}
-
}
從上文代碼不難看出,HashMap已保存1個"green"的Apple對象,但是,,在履行時,會產(chǎn)生1個問題,,,用map獲得"Apple"對象時,并未找到。
但是,進入breakpoint調(diào)試時,可在變量內(nèi)看見map中apple的散列碼,說明已正常存入。
但是,為何會造成這問題呢,,,這就是本文主旨所在。
---是由于hashCode()引發(fā),由于沒有重寫hashCode()方法.
equals()方法與hashCode()方法的隱式調(diào)用時的約定是:
1.如果兩個對象相等(equals),那末他們必須具有相同的哈希嗎(hashCode)
2.即便兩個對象具有相同的hashCode,他們也不1定相等.
Map的核心思想就是可以比線性查找更快. 通過散列值(hash)作為鍵(key)來定位對象的進程分為兩步:
在Map內(nèi)部,存儲著1個頂層數(shù)組,頂層數(shù)組的每一個元素指向其他的數(shù)組,查找或存儲的時候,先根據(jù)key對象的hashCode()值計算出數(shù)組的索引,然后到這個索引找到所指向的第2層線性數(shù)組,使用equals方法來比較是不是有相應(yīng)的值(以返回或存儲).
Object類中的hashCode()默許為每一個對象返回不同的int值,因此在上面的例子中,兩個相等(equal)的對象,返回了不同的hashCode值.
解決方法是為此類添加hashCode方法,比如,使用color字符串的長度作為示范:
-
public int hashCode(){
-
-
-
return this.color.length();
-
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈