web-dev-qa-db-ja.com

Java ObjectでのhashCodeの実装は何ですか?

重複の可能性:
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です。

14
andyqee

hashCodenativeメソッドであり、システムライブラリが内部的に呼び出されることを意味します。詳細については、 Java Native Interface を参照してください。

SO hashCode()とgetClass()がネイティブメソッドである理由 に質問があります。

18
Kai

デフォルトのhashCodeは実装固有になります。これはメモリアドレスに関連していると思われますが、VMはオブジェクトをメモリ内で移動します(もちろん、hashCodeは同じままである必要があります)。したがって、 実際メモリアドレス。

5
Brian Agnew

デフォルトのhashcode()実装は頻繁に、しかし常にではありませんが、オブジェクトのメモリアドレスに大まかに基づいた整数を提供しますが、メモリアドレスは変更される可能性があります。これは、JVMの実装によって大きく異なる場合があります。

ハッシュコード()

ご存知のように、このメソッドはオブジェクトのhasコードを提供します。基本的に、Objectによって提供されるhashCode()のデフォルトの実装は、メモリアドレスを整数値にマッピングすることによって導出されます。 Objectクラスのソースを調べると、hashCodeの次のコードが見つかります。

public native int hashCode();

これは、hashCodeがある程度のメモリアドレスを提供するネイティブ実装であることを示しています。ただし、実装クラスのhashCodeメソッドをオーバーライドすることは可能です。

http://www.javaworld.com/community/node/1006

3
Kevin Bowersox