HashMapでキーとして設定したいクラスがあります。私はすでにそのクラスのcompareToメソッドを実装しています。しかし、それでも私がするとき:
map.put(new MyKey(dummyArguements)、dummyValue); System.out.println(map.get(new MyKey(dummyArguements)));
Nullになります。つまり、ハッシュマップは2つのキー(getとputの呼び出し用)が同じであることを識別できません。
誰かがここで私を助けてくれませんか?
hashCode()
とequals()
を実装する必要があります。ソートされたマップ/セットには、compareTo()
が追加で必要です。
詳細については、 この質問 を参照してください。
equals()
とhashCode()
を実装する必要があります。クラスも不変である必要があります。変更可能である場合、マップに追加した後にハッシュコードが変更される可能性があります。その場合、マップはそれを見つけるのに問題が発生する可能性があります。
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 ) 。
Java8以降、ハッシュクラッシュの数が11を超えると、HashMapはエントリをバイナリツリーに格納するため、Comparable(compareToを追加)も実装する必要があります。そうしないと、パフォーマンスが低下します
hashCode()
を定義しましたか?ソートにはcompareTo
が必要です。
HashMap
はcompareTo()
をチェックしません。
HashMap
はhashCode()
とequals()
をチェックします。
MapやSetなどのハッシュに依存するコレクションを使用する場合は、正しい機能を保証するためにequals()
とhashCode()
を実装する必要があります。新しいmyKeyは、デフォルトのequals()
およびhashCode()
の実装を使用するため、マップに格納されているキーとは常に異なります。
Equals()とhashCode()を実装する必要があります。クラスも不変である必要があります。変更可能である場合、マップに追加した後にハッシュコードが変更される可能性があります。その場合、マップで問題が発生する可能性があります。