あなたが提案することを行うと、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番目のキーを使用しているためです。実際には、マップ値をキーで取得することは不可能です。