HashSetコレクションに、
nameフィールドを"ケント"と設定したHero型インスタンスh1を格納しました。
次に、h1に新しくHero型インスタンス、nameフィールド"ケント"を生成しました。
java
1Set<Hero> Member = new HashSet<Hero>(); 2 Hero h1 = new Hero(); 3 h1.name = "ケント"; 4 5 list.add(h1); 6 System.out.println("要素数=" + list.size()); 7 8 h1 = new Hero(); 9 h1.name = "ケント"; 10 list.remove(h1); 11 System.out.println("要素数=" + list.size());
その後、h1をremoveメソッドで取り除いたのですが、
要素数は、removeメソッドを取り除く前と同じでした。
要素数の除去はhashcode()をオーバーライドすれば解決できたのですが、
今回格納した要素"h1"は、インスタンス変数名が同じで、
ハッシュ値は変わらないと思うのです。
オーバーライドの内容
java
1@Override 2 public int hashCode() { 3 final int prime = 31; 4 int result = 1; 5 result = prime * result + ((name == null) ? 0 : name.hashCode()); 6 return result;
hashCode()メソッドのオーバーライドの有無で結果が変わるのはなぜでしょうか?
##追記】
手元の参考書には
ハッシュ値の条件として
・同じ(等価)インスタンスからは、必ず同じハッシュ値が得られること
・異なるインスタンスからは、なるべくことなるハッシュ値が得られること
と書かれていました。
変数名ではなく、参照先のアドレスからハッシュ値を生成しているのでしょうか。
そう考えるとオーバーライドによって結果が変わることに納得できます。
発生している問題・エラーメッセージ
要素数=1 要素数=1
該当のソースコード
java
1import java.util.HashSet; 2import java.util.Set; 3 4class Hero { 5 public String name; 6 7 @Override 8 public boolean equals(Object obj) { 9 if (this == obj) 10 return true; 11 if (obj == null) 12 return false; 13 if (getClass() != obj.getClass()) 14 return false; 15 Hero other = (Hero) obj; 16 if (name == null) { 17 if (other.name != null) 18 return false; 19 } else if (!name.equals(other.name)) 20 return false; 21 return true; 22 } 23} 24 25public class TryOverRideSet { 26 27 public static void main(String[] args) { 28 Set<Hero> Member = new HashSet<Hero>(); 29 Hero h1 = new Hero(); 30 h1.name = "ケント"; 31 32 list.add(h1); 33 System.out.println("要素数=" + list.size()); 34 35 h1 = new Hero(); 36 h1.name = "ケント"; 37 list.remove(h1); 38 System.out.println("要素数=" + list.size()); 39 } 40 41}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/15 15:31
2020/03/15 18:34
2020/03/16 15:30