なぜ私のクラスは、Java HashSetの中で正常に動作しませんか?
-
11-09-2019 - |
質問
私は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(オブジェクトo)を変更し、ハッシュ関数を編集しませんでした。それは単純なプロジェクトだとJavaドキュメントは、それがo.equals(これ)を使用すると述べているので、私は私がする必要はないと思っています。
解決
あなたは、同様のhashCode()メソッドをオーバーロードする必要がある場合があります。
他のヒント
HashSet.add(Object data)
はHashSet.add(new Test(String, int))
に等しくない
HashSet.add(new Test("asdf", 1));
を使用してみてください。そしてhashCode()
メソッドからオーバーライドを作ります。あなたのコードをコンパイルしていますか?
あなたのコードもコンパイルされません...
HashSetのは、2つの引数を受け取りadd()メソッドを持っていない。
あなたが意味する場合は、
t.add(new Test("asdf", 1));
タグの代わりに
t.add("asdf", 1);
前に述べたように、、ハッシュコードを確認することと適切に実施されたテストクラスのメソッドに等しい。
内部ハッシュテーブルは、ハッシュコードの衝突がある場合に平等をテストするために)あなたのオブジェクトをハッシュとバケットに、)(オブジェクト#のハッシュコードを使用して、#の等号を(オブジェクトます。あなたはこれらのメソッドは、オブジェクトのインスタンスのID(参照ID)を使用します)(そうでない場合は、デフォルトのオブジェクト#に等しい、文字列の等価性をテストするために、あなたのケースで、あなたのテストクラスは、適切な実装(overrrides)を提供していることを確認する必要があります。このトピックに関するチュートリアルについてはこちらをのを参照してください。ます。