0
class Employee {
String name;
Employee(String name) {
this.name = name;
}
// hashCode method is not overridden
}
public class HashCodeConfusion {
public static void main(String[] args) {
Employee emp = new Employee("ABC");
Employee emp1 = new Employee("ABC");
if (emp == emp1) {
System.out.println("Employee Same reference");
} else {
System.out.println("Employee Different reference");
}
if (emp.hashCode() == emp1.hashCode()) {
System.out.println("Employee Same hash code");
} else {
System.out.println("Employee Different hash code");
}
// -----------------------------------
String str = new String("ABC");
String str1 = new String("ABC");
if (str == str1) {
System.out.println("String Same reference");
} else {
System.out.println("String Different reference");
}
if (str.hashCode() == str1.hashCode()) {
System.out.println("String Same hash code");
} else {
System.out.println("String Different hash code");
}
}
}
質問/混乱オブジェクト: ObjectクラスのデフォルトのhashCodeを考慮にオブジェクト参照を取るだけでなく、中身しているように見える 、なぜそうでないだろう従業員クラスのオブジェクトと同じ名前が別のハッシュコードで出てくるのでしょうか? Objectクラスのデフォルトの実装で、内容のみに基づくハッシュアルゴリズムがある場合、hashCodeメソッドをオーバーライドする必要はありません。ただし、同等のパラダイムがビット単位の互換性に合致する限りです。他のクラス対文字列のハッシュコードは
この混乱をクリアするには?
デフォルトのハッシュコードは_alone_の参照に生成されます。コンテンツはここでは無関係です。しかし、 'String'やプリミティブラッパーのような他のクラスは、独自のコンテンツベースの実装を提供します。多くの場合、クラスのすべてのフィールドが 'equals()'と 'hashCode()'によって使われるわけではないので、これをそのまま使うことはできません(例としてjava.util.Dateを見てください)。ハッシュコードを提供するために 'cdate'か' fastTime'のどちらかを使います - 全てのフィールドを使っているデフォルト実装はそのことを知らないでしょう)。 – Thomas
"コンテンツの内容だけでなくオブジェクトの参照も考慮に入れています。 –