0

私は自分HashSetが作成したクラスのを使用するプロジェクトに取り組んでいます。これに名前を付けTestます。私は次のように述べたものを定義しましたHashSet

HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));

使ってみました

t.contains(new Test("asdf", 1));

しかし、それはを返しますfalse。しかし、私が使用するとき、HashSet<Character>それはうまくいくようです。以前の宣言を上書きしようとしましequalsたが、機能しませんでした。私は一人で去ろうとしequalsました、しかし私はまだ得falseました。私は自分が間違っていることを知る必要がありますか?

また、ハッシュ関数を編集せず、Test.equals(Object o)のみを変更しました。これは単純なプロジェクトであり、Javaのドキュメントにはo.equals(this)を使用すると記載されているため、使用する必要はないと思いました。

4

4 に答える 4

5

hashCode() メソッドもオーバーロードする必要がある場合があります。

于 2009-12-01T16:47:50.187 に答える
4

HashSet.add(Object data)等しくないHashSet.add(new Test(String, int))

使ってみてくださいHashSet.add(new Test("asdf", 1));。そして、hashCode()メソッドからオーバーライドを行います。コードはコンパイルされますか?

于 2009-12-01T16:50:12.330 に答える
3

あなたのコードはコンパイルさえしません...

HashSetには、2つの引数を受け入れるadd()メソッドがありません。

あなたが意味するなら

t.add(new Test("asdf", 1));

それ以外の

t.add("asdf", 1);

前に述べたように、Testクラスのハッシュコードとequalsメソッドが適切に実装されていることを確認してください。

于 2009-12-01T17:07:27.387 に答える
2

内部的には、ハッシュ テーブルは Object#hashCode() を使用してオブジェクトをハッシュおよびバケット化し、Object#equals() を使用して hashCode の衝突があるかどうかをテストします。Test クラスが適切な実装 (オーバーライド) を提供することを確認する必要があります。ケースでは、文字列が等しいかどうかをテストします。それ以外の場合、デフォルトの Object#equals() メソッドはオブジェクト インスタンス ID (ref id) を使用します。このトピックに関するチュートリアルについては、こちらを参照してください。

于 2009-12-01T16:49:39.977 に答える