クイック質問:カスタムクラスをキーとしてHashMap
を使用したい場合は、はにする必要があります。hashCode
関数をオーバーライドしますか?私がその機能を無効にしないと、どのように機能しますか?カスタムキーでHashMapを使用する
答えて
同じオブジェクトが同じhashCodeを持つ限り、技術的には、hashCodeメソッドをオーバーライドする必要はありません。
Objectで定義されたデフォルトの動作を使用すると、equalsは同じインスタンスに対してのみtrueを返しますが、hashCodeメソッドをオーバーライドする必要はありません。
しかし、equalsメソッドとhashCodeメソッドをオーバーライドしないと、常に同じキーインスタンスを使用していることを確認する必要があります。
例えば:実際には
MyKey key1_1 = new MyKey("key1");
myMap.put(key1_1,someValue); // OK
someValue = myMap.get(key1_1); // returns the correct value, since the same key instance has been used;
MyKey key1_2 = new MaKey("key1"); // different key instance
someValue = myMap.get(key1_2); // returns null, because key1_2 has a different hashCode than key1_1 and key1_1.equals(key1_2) == false
あなたは、多くの場合、キーのインスタンスを1つだけ持っているので、技術的にあなたがイコールとhashCodeメソッドをオーバーライドする必要はありません。
しかし、いつかキーとして使用されるクラスのequalsメソッドとhashCodeメソッドをオーバーライドすることをお勧めします。後であなたや他の開発者が同じインスタンスを使用する必要があることを忘れてしまい、問題を追跡しにくくなる可能性があります。
注意:equalsメソッドとhashCodeメソッドをオーバーライドしても、equalsメソッドまたはhashCodeメソッドの結果を変更する方法でキーオブジェクトを変更しないようにする必要があります。それ以外の場合は、あなたの価値をもう見つけませんか?そのため、可能であれば不変オブジェクトをキーとして使用することをお勧めします。
あなたは参照の等価のデフォルトObject.equals
定義を使用して、あなたはまた、equals
をオーバーライドしないときは、hashCode()
関数をオーバーライドする必要はありません唯一の時間です。これはあなたが望むものであってもなくてもかまいません。特に、同じフィールド値を持っていても異なるオブジェクトではなく、は等しいと見なされます。
あなたがequals
なくhashCode
をオーバーライドする場合は、HashMap
動作は(読み:それは全く意味を成さず、完全に破壊されます)不定となります。
hashCode AND equalsをオーバーライドしないと、その内容に関係なく、各オブジェクトが異なるデフォルトの動作が得られます。
キーとして使用しているオブジェクトクラスによって異なります。あなたが提案したようなカスタムクラスで、何も拡張していない場合(つまり、それがObject
を拡張している場合)、hashCode関数はObject
のものになり、メモリ参照が考慮されます。異なるコード。
だから、hashCode()
の機能を持つクラスを拡張する場合を除き、自分で実装する必要があります。 equals()
も実装してください:ArrayList
のようなクラスはequalsのみを使用し、HashMapのようなクラスはhashCode()
とequals()
の両方をチェックします。
あなたは絶対に正しいです。ちょうどHashMap.put()を確認してください。本当に間違っていました。ありがとう!私はあなたのコメントを反映するために答えを修正しました。 – Miquel
実装の詳細を確認することなく、抽象的なレベルでは、ハッシュの衝突を避けることができるため、抽象的なレベルでなければならないことがわかります。 'equals'が考慮されていなければ、ハッシュコードに衝突する2つのオブジェクトは同じになります。 –
キーが不変でない場合は、問題が発生する可能性があることも考慮してください。変更可能なキーを持つエントリをマップに配置すると、後でキーを変更してハッシュコードに影響し、マップ内のエントリを失う可能性があります。これ以上取得できないためです。
Objectクラスのequals()
およびhashCode()
メソッドをオーバーライドする必要があります。 java.lang.Object
から継承されるequals()
とhashcode()
のデフォルトの実装では、オブジェクトインスタンスのメモリ位置(例:[email protected]
)が使用されます。オブジェクトの2つのインスタンスが同じプロパティを持ちますが、継承されたequals()
はmemory location
を使用するため、2つのインスタンスで異なるため、false
を返すと問題が発生する可能性があります。
また、toString()
メソッドをオーバーライドして、オブジェクトの適切な文字列表現を提供することもできます。クラスはequals()
をオーバーライドする場合
主な考慮事項キー定義されたユーザーを実装する際に
- 、それは
hashCode()
をオーバーライドする必要があります。 - 2つのオブジェクトが等しい場合は、
hashCode
の値も同じでなければなりません。 - フィールドが
equals()
で使用されていない場合は、hashCode()
で使用しないでください。 - 頻繁にアクセスされる場合は、パフォーマンスを向上させるためのキャッシングの候補には
hashCode()
があります。
- 1. ルーティングファイルにカスタムキーを使用
- 2. Rails、Mongoid:カスタムキーとカスタムキーフォーマットを使用する
- 3. log4j2とJSONLayoutを使用したカスタムキー値
- 4. Googleのデータストアのカスタムキーnodejsを使用
- 5. Android - HashMapでupdateChildren()を使用
- 6. HashtableとHashMapを使用する場合
- 7. xslt 2.0:HashMapを使用
- 8. golangを使用してjson応答でカスタムキーを作成する方法
- 9. カスタムキーで `find_by`を拡張する
- 10. カスタムキーでSecureStringを復号する
- 11. HashMapのArrayListでHashMapを検索する
- 12. Hashmapはランダムアクセスを使用しますか?
- 13. GroovyとJavaのカスタムキーを使ったマップ
- 14. OpenIddict - カスタムキーを使用すると、リフレッシュトークンフローによってエンティティエラーが発生する
- 15. GroovyでHashMapを取り込むクロージャーメソッドを使用する
- 16. JavaでUnicodeを使用してHashMapを作成する
- 17. カスタムキーを使用したC#の配列またはリスト
- 18. HashMapではなくAndroidのArrayMapを使用するタイミングは?
- 19. 次のコードでhashmapを使用する方法
- 20. 変数でHashMapを使用する方法は? Java sqlite
- 21. カスタムキー昇華
- 22. Firebaseプッシュアイテムのカスタムキー
- 23. カスタムキー機能は
- 24. AndroidのBLEは暗号化のためのカスタムキーを使用できます
- 25. HashMapを使用してPrepared Statement、例外
- 26. Crashlyticsカスタムキーを検索する方法
- 27. Mongoid関連のカスタムキー
- 28. ThreadLocalをHashMapのキーとして使用できますか?
- 29. RxJavaを使用してHashMap値を変換する
- 30. moshiを使用してHashMapを変換する
彼が彼のために働くhashCodeを持つものを拡張していない限り、 – Miquel