私は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)));
}
HashMap には各エントリに関連付けられたハッシュ コードをキャッシュする最適化があり、ハッシュ コードが一致しない場合はオブジェクトの等価性をチェックしないため、これは "null" を出力します。それは私には理にかなっています。しかし、私がこれを行うとき:
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)));
}
これで「ジェニー」が返されます。2 番目のケースで失敗しなかった理由を説明できますか?