據我已閱讀,HashMap的不正確的equals和hashCode實現
使用對象爲重點,以一個HashMap,它必須提供正確的 覆蓋和執行的等於和hashCode 方法。 HashMap中獲得(密鑰K)方法調用鍵 對象的hashCode方法和適用返回散列值自身的靜態哈希 功能找到一個桶的位置(備份陣列),其中鍵和 值存儲在形式稱爲Entry(Map.Entry)的嵌套類。 HashMap的內部散列方法防止質量差的散列 函數。
爲了測試這些合同,我寫了一個bean類的不正確,但法律的實施等於和的hashCode方法。
類:
public class HashVO {
private String studentName;
private int age;
private boolean isAdult;
public HashVO(String studentName, int age, boolean isAdult) {
super();
this.studentName = studentName;
this.age = age;
this.isAdult = isAdult;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isAdult() {
return isAdult;
}
public void setAdult(boolean isAdult) {
this.isAdult = isAdult;
}
@Override
public String toString() {
return studentName + " : " + age + " : " + isAdult;
}
@Override
public boolean equals(Object obj) {
return false;
}
@Override
public int hashCode() {
return 31;
}
}
在這種情況下,HashMap中的散列法,
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16);
}
也應該返回相同的值,因爲每次的散列碼總是返回31.因此,如果對象類HashVO被用作hashMap的鍵,get方法不應該工作,因爲它應該去同一個桶來檢索對象,並且equals方法總是返回false,所以它將不能夠找到匹配fo r關鍵對象。
但是,當我使用這個方法,
public static void main(String[] args) {
HashMap<HashVO, String> voMap = new HashMap<HashVO, String>();
HashVO vo = new HashVO("Item1", 25, true);
HashVO vo1 = new HashVO("Item2", 12, false);
HashVO vo2 = new HashVO("Item3", 1, false);
voMap.put(vo, "Item");
voMap.put(vo1, "Item1");
voMap.put(vo2, "Item2");
System.out.println(voMap.get(vo));
System.out.println(voMap.get(vo1));
System.out.println(voMap.get(vo2));
}
的輸出是正確的,並顯示
Item
Item1
Item2
我想知道爲什麼這個正確的輸出甚至未來的equals和hashCode方法實施是不正確的。
我認爲你是對的。我使用Java 8來運行程序。 Java 8中的HashMap在getNode方法中也有類似的實現(行:566)。 – Dripto 2014-12-05 15:50:46