teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ハッシュコードはhashCodeの規約

2017/05/17 22:44

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -22,4 +22,11 @@
22
22
  System.out.println(y.equals(x)); //xの名前がnullでないためtrue
23
23
  ```
24
24
 
25
- という問題があります。
25
+ という問題があります。
26
+
27
+ [Object#equals](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#equals-java.lang.Object-)
28
+
29
+
30
+ > 通常、このメソッドをオーバーライドする場合は、hashCodeメソッドを常にオーバーライドして、「等価なオブジェクトは等価なハッシュ・コードを保持する必要がある」という**hashCodeメソッドの汎用規約**に従う必要があることに留意してください。
31
+
32
+ ハッシュコードの話はequalsではなくhashCodeの汎用規約でした。

1

完全に規約違反だった

2017/05/17 22:44

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -2,4 +2,24 @@
2
2
 
3
3
  MyStuff以外のインスタンスが渡ると例外になってしまう
4
4
 
5
- という点で問題があります。
5
+ という点で問題があります。
6
+
7
+ ---
8
+
9
+ ごめんなさい。それ以前に大きな問題がありました。
10
+ このequalsメソッドは引数をMyStuffにキャストしたときに、引数に名前があるか否かだけで判定しています。
11
+ そのため、
12
+ - 名前がnullのMyStuffを作ると、自分自身にfalse判定を出してしまう(反射性違反)
13
+ ```java
14
+ MyStuff x = new MyStuff(null);
15
+ System.out.println(x.equals(x)); //反射性によりtrueを返すべきだが、falseになる
16
+ ```
17
+ - 名前がnullと非nullのインスタンスを作って比較すると、x.equals(y)とy.equals(x)の結果が一致しない(対称性違反)
18
+ ```java
19
+ MyStuff x = new MyStuff("name");
20
+ MyStuff y = new MyStuff(null);
21
+ System.out.println(x.equals(y)); //yの名前がnullによりfalse
22
+ System.out.println(y.equals(x)); //xの名前がnullでないためtrue
23
+ ```
24
+
25
+ という問題があります。