1

キーとその値を Map に入れたいとします。

私はそれがJavaがすることだと信じています:

  1. キーのハッシュコードを取得し、マップ内に同じハッシュコードを持つキーがあるかどうかを確認します。

  2. 同じ Hashcode を持つキーがない場合、そのキーを Map に入れることができます。

  3. 同じ Hashcode を持つキーがある場合は、equals を使用して、そのキーを Map に入れることができるかどうかを判断します。

私の質問は、このプロセスで==代わりに使用しないのはなぜですか?equals

4

5 に答える 5

11

あなたが提案することを行うと、equals/hashCodeタンデムの概念全体が壊れます。equalsとの両方hashCodeが役に立たなくなり、存在すらすべきではありません。

Java を使用すると、プログラマーは自分のクラスの等価セットを定義できます。彼がそれをしたくない場合は、単純に and のオーバーライドequalsをオプトアウトすることができますhashCode— そして、あなたが提案したセマンティクスとまったく同じになることになります。

特定の例を挙げると、あなたの提案では、これによりマップに 2 つの別個のエントリが作成されます。

Map<Integer, String> map = new HashMap<>();
map.put(10_000, "a");
map.put(10_000, "a");

これは、リテラル 10_000 が の新しいインスタンスに毎回自動ボックス化されるためですInteger。これは、セマンティクスでは 2 つの別個のキーです。そして、声明は

System.out.println(map.get(10_000));

nullもちろん、取得するために3番目のキーを使用しているためです。実際には、マップ値をキーで取得することは不可能です。

于 2013-08-03T11:10:32.683 に答える
4

==オブジェクト指向の意味ではあまり意味がありません。

new Integer(3)and new Integer(3)andnew Integer(2+1)はすべて等しいと見なされます。他のすべては本当に混乱しています。これがequals説明するものです。これがないと、元のキーへの参照がなくなったときに HashMap() から何かを抽出することは不可能になります。また、データベースからのデータに基づいて HashMap に何かが入れられた場合、ユーザーからの入力を使用して HashMap で何かを検索することもできません。

の周りの問題を探している場合==、それは本当に「等しい」ことを意味する必要があり、参照整合性には、常に使用しないため、誰も実際には知らないあいまいなハンドルが必要です。ちなみに、これは Scala などの他の言語とまったく同じです。equalshashCode==

于 2013-08-03T11:20:24.983 に答える
2

「==」は 2 つのオブジェクトの参照とコンテンツを比較するために使用されるためです.equals()。Java コレクション JFrame を使用する際の重要なルールの 1 つは、 equals メソッドをオーバーライドすることです。.hashCode()同じキー (ハッシュ コード)。.enquals をオーバーライドしない場合、呼び出されるメソッドは、参照を "==" と比較する Object クラスからのものになります。オーバーライドするときの重要な詳細の 1 つ.hashCode()は、最終フィールドを使用することです。

于 2013-08-03T11:11:48.593 に答える
2

java == では、参照の等価性をチェックするために使用されますが、代わりに equals() と hashCode()がオブジェクトの等価性の「単一概念」として連携します。
== で動作する Map が必要な場合は、IdentityHashMapを使用してください。

于 2013-08-03T11:13:28.430 に答える
2

キーはオブジェクト型であり、すべてのクラスは Object クラスから派生しています。自分で作成したクラスのキーを使用していて、そのクラスで equals メソッドをオーバーライドしない場合、どうなりますか? 答えは次のとおりです。

クラスの 2 つのオブジェクトがまったく同じ属性値を持っているかどうかに関係なく、equals の結果は false になります。デフォルトが等しいという理由だけで、実装は2つのオブジェクトが同じメモリ位置を指しているかどうかをチェックします。これはまさに == 比較が行うことです。

ここで、== ではなく equals の hashMap の使用法について説明します。これは、マップにキーを配置しようとすると、JVM が 2 つのオブジェクトが等しいかどうかをチェックしようとするためです。JVM がこの等価性をチェックする唯一の方法は、equals メソッドを使用することです。デフォルトの実装では、== 比較が行うことを行います。しかし、上で述べたように、2 つのオブジェクトが同じ属性を持っている場合、それらは実際には同等です。しかし悲しいことに、== 比較では属性の比較を行うことができず、真の値が得られます。したがって、equals メソッドをオーバーライドするか、equals メソッドを使用することは、値を Map に格納する際に論理的に重要です。

于 2013-08-03T11:14:05.210 に答える