重複の可能性:
JavaでhashCode()はどのように計算されますか
JavaのルートクラスObject
の_hashCode()
_メソッドに実装がないことがわかりました。
_public native int hashCode();
_
_Object a
_と_Object b
_がある場合、a.hashCode()
を使用せずにb.hashCode()
とSystem.out.println()
の値を知るにはどうすればよいですか? hashCode
の実装だけで。
私は2つのnew
オブジェクトをArrayList
しようとしましたが、驚いたことにhashCode()
の値は同じです。どちらも1です。
hashCode
はnative
メソッドであり、システムライブラリが内部的に呼び出されることを意味します。詳細については、 Java Native Interface を参照してください。
SO hashCode()とgetClass()がネイティブメソッドである理由 に質問があります。
デフォルトのhashCodeは実装固有になります。これはメモリアドレスに関連していると思われますが、VMはオブジェクトをメモリ内で移動します(もちろん、hashCodeは同じままである必要があります)。したがって、 実際メモリアドレス。
デフォルトのhashcode()
実装は頻繁に、しかし常にではありませんが、オブジェクトのメモリアドレスに大まかに基づいた整数を提供しますが、メモリアドレスは変更される可能性があります。これは、JVMの実装によって大きく異なる場合があります。
ハッシュコード()
ご存知のように、このメソッドはオブジェクトのhasコードを提供します。基本的に、Objectによって提供されるhashCode()のデフォルトの実装は、メモリアドレスを整数値にマッピングすることによって導出されます。 Objectクラスのソースを調べると、hashCodeの次のコードが見つかります。
public native int hashCode();
これは、hashCodeがある程度のメモリアドレスを提供するネイティブ実装であることを示しています。ただし、実装クラスのhashCodeメソッドをオーバーライドすることは可能です。