我正在阅读 Effective Java Item 9 并决定自己运行示例代码。但它的工作方式略有不同,具体取决于我如何插入一个我不明白里面到底发生了什么的新对象。PhoneNumber 类看起来:
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)));
}
这将打印“null”,并且在书中进行了解释,因为 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)));
}
现在它返回“珍妮”。你能解释为什么它在第二种情况下没有失败吗?