web-dev-qa-db-ja.com

Javaハッシュマップのキーとして独自のクラスを設定する

HashMapでキーとして設定したいクラスがあります。私はすでにそのクラスのcompareToメソッドを実装しています。しかし、それでも私がするとき:

 map.put(new MyKey(dummyArguements)、dummyValue); 
 System.out.println(map.get(new MyKey(dummyArguements))); 

Nullになります。つまり、ハッシュマップは2つのキー(getとputの呼び出し用)が同じであることを識別できません。

誰かがここで私を助けてくれませんか?

16
Nikhil Garg

hashCode()equals()を実装する必要があります。ソートされたマップ/セットには、compareTo()が追加で必要です。

詳細については、 この質問 を参照してください。

36
Mike Q

equals()hashCode()を実装する必要があります。クラスも不変である必要があります。変更可能である場合、マップに追加した後にハッシュコードが変更される可能性があります。その場合、マップはそれを見つけるのに問題が発生する可能性があります。

13
amorfis

1)一般に、コレクションの場合、オーバーライドするのは、クラスのequals()メソッド(およびhashcode()メソッド)です。 compareTo()/ CompareableとComparatorは通常、並べ替えに使用され、場合によってはオブジェクトの同等性にequals()メソッドを使用する代わりになります。例としてはTreeSetなどのSortedSetの実装者があります。

2)コードのJava命名基準に準拠してください。クラス名は大文字にする必要があります...例:new MyKey(dummyArguments)http:// www。詳細については、Oracle.com/technetwork/Java/codeconventions-135099.html#367 (および http://www.Oracle.com/technetwork/Java/codeconvtoc-136057.html ) 。

3
whaley

Java8以降、ハッシュクラッシュの数が11を超えると、HashMapはエントリをバイナリツリーに格納するため、Comparable(compareToを追加)も実装する必要があります。そうしないと、パフォーマンスが低下します

0
Sander Hautvast

hashCode()を定義しましたか?ソートにはcompareToが必要です。

0
fastcodejava

HashMapcompareTo()をチェックしません。

HashMaphashCode()equals()をチェックします。

MapやSetなどのハッシュに依存するコレクションを使用する場合は、正しい機能を保証するためにequals()hashCode()を実装する必要があります。新しいmyKeyは、デフォルトのequals()およびhashCode()の実装を使用するため、マップに格納されているキーとは常に異なります。

0
kostja

Equals()とhashCode()を実装する必要があります。クラスも不変である必要があります。変更可能である場合、マップに追加した後にハッシュコードが変更される可能性があります。その場合、マップで問題が発生する可能性があります。

0
vikash bhorale