クラスが をオーバーライドせずhashCode()
、 からデフォルトの実装を継承するだけの場合java.lang.Object
、典型的な JVM では、そのhashCode()
は多かれ少なかれ、それへの内部ポインタになります。(明らかに、これがすべてではありません。なぜなら、の戻り値の型はhashCode()
isint
であり、これは 64 ビット JVM に対応しないからです。また、これらは物理メモリ位置への実際のポインターではありません。まず、OS が仮想アドレスから物理アドレスへのマッピングを処理するためです。 2 つ目は、JVM がそれを処理したとしても、ガベージ コレクターはオブジェクトに影響を与えることなく、あるヒープから別のヒープにオブジェクトを移動できるためhashCode()
です。それでも、「内部メモリ アドレス」は適切な最初の概算です。)
ほとんどの JDK クラスがオーバーライドする理由は、常に「互換性」hashCode()
を保ちたいからです。つまり、 の場合、 が必要です。(これは、たとえば、キーが 2 つの異なるインスタンスであるという理由だけで aに 2 つの異なるエントリを持たせたくないということを考えると理にかなっています。キーの元のインスタンスを手元に用意する必要はありません.2 つのキーが等しい場合、通常はそれらを等しいものとして扱いたいと考えています。)hashCode()
equals()
a.equals(b)
a.hashCode() == b.hashCode()
Map<String, Object>
"abc"
String
map.get("abc")
マップでポインターの等価性が本当に必要な場合は、java.util.IdentityHashMap
classを使用できます。