0
class KeyMaster {
  public int i;
  public KeyMaster(int i) { this.i = i; }
  public boolean equals(Object o) { return i == ((KeyMaster)o).i; }
  public int hashCode() { return i; }
}


public class MIt 
{
 public static void main(String[] args) {
  Set<KeyMaster> set = new HashSet<KeyMaster>();
  KeyMaster k1 = new KeyMaster(1);
  KeyMaster k2 = new KeyMaster(2);
  set.add(k1); 
  set.add(k1);
  set.add(k2); 
  set.add(k2);
  System.out.println(set.size()+":");

  k2.i = 1; // this is creating another object in HashSet
  set.remove(k1);
  System.out.println(set.size()+":");
  set.remove(k2);
  System.out.print(set.size());
}
}

HashSet に 2 つのオブジェクトを追加して削除しましたが、最後の SOP にはまだサイズ 1 があります。k2 の値を更新したことには同意しますが、まだそれをセットに追加していません。

4

3 に答える 3

3

のJavadocからHashSet.remove()

指定された要素が存在する場合は、このセットから削除します。より正式には、 (o==null ? e==null : o.equals(e)) となる要素 e を削除します。

コードに次のようなコメント行があります。

k2.i = 1; // this is creating another object in HashSet

そこで何が起こっているとあなたが思うかはわかりませんが、そうではありません。

k2に配置したオブジェクトへの参照ですHashSet。オーバーライドされたメソッドとメソッドiで使用している、そのオブジェクトの値を変更しました。これは、ハッシュを含む何かについて話しているときや、変更可能なオブジェクトをキーとして使用してはいけない理由について話しているときに行うのは本当に悪いことです。equals()hashcode()

文字通り見つからなくなりました。

HashSet.remove()を返しますboolean- その戻り値を確認すると、false であることがわかります。

于 2013-05-04T04:59:08.053 に答える
2

k2.i = 1;HashSet に別のオブジェクトを作成していませんが、k2 のハッシュ コードを変更しています。set.remove(k2);これが、 k2 を見つけて削除できない理由です。戻り値をテストset.remove(k2)すると、オブジェクトが削除されなかったことを意味する false が表示されます。

于 2013-05-04T04:56:21.723 に答える