我正在閱讀Effective Java Item 9,並決定自行運行示例代碼。但它的工作原理略有不同,具體取決於我如何插入一個新的對象,我不明白到底發生了什麼。該******中國一流的樣子:有效的Java項目9:重寫hashcode示例
public class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
public PhoneNumber(int areaCode, int prefix, int lineNumber) {
this.areaCode = (short)areaCode;
this.prefix = (short) prefix;
this.lineNumber = (short)lineNumber;
}
@Override public boolean equals(Object o) {
if(o == this) return true;
if(!(o instanceof PhoneNumber)) return false;
PhoneNumber pn = (PhoneNumber)o;
return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode;
}
}
然後再根據這本書,爲的是當我試過了,
public static void main(String[] args) {
HashMap<PhoneNumber, String> phoneBook = new HashMap<PhoneNumber, String>();
phoneBook.put(new PhoneNumber(707,867,5309), "Jenny");
System.out.println(phoneBook.get(new PhoneNumber(707,867,5309)));
}
這版畫「空」,並在書中解釋,因爲HashMap中有緩存的優化散列碼與每個條目相關聯,並且如果散列碼不匹配,則不檢查對象相等性。對於我,這說得通。但是,當我這樣做:
public static void main(String[] args) {
PhoneNumber p1 = new PhoneNumber(707,867,5309);
phoneBook.put(p1, "Jenny");
System.out.println(phoneBook.get(new PhoneNumber(707,867,5309)));
}
現在返回「珍妮」。你能解釋爲什麼它在第二種情況下沒有失敗嗎?
必須以某種方式相同的實例,除非實際上重寫'int hashCode()'。 –
不,我不是在任何地方重寫hashCode。這是這個例子的重點,如果你不重寫hashCode,它將無法正常工作。我知道它會返回「Jenny」,因爲這兩個實例是相同的實例,但想知道與第一個實例相比有什麼不同。 – pandagrammer
這不可能是你正在運行的代碼 - 你在開始時在語句結尾處缺少分號。這讓我想知道你正在運行的實際代碼中* else *是不同的。我們無法幫助您理解我們無法看到的代碼。 (只是添加分號,我不能重現你的問題。) –