2017-01-03 9 views
0

公式ドキュメントに情報が見つかりませんでした。 Boolean.hashCode(boolean b)は、真と偽の2つの素数1231と1237を返します。私はAtomicBooleanの同様の実装を望んでいます。しかし、逆コンパイルされたクラスファイルではpublic native int hashCode();Objectと表示されているようです - それはメモリの場所を返しますか?AtomicBooleanのhashCodeとは何ですか?

+2

あなたは単にそれを試して、何が起こるか見ることができます。 – luk2302

答えて

3

hashCodeAtomicBooleanでオーバーライドされていない理由package summary伝えます:

アトミッククラスは、java.lang.Integerのと関連するクラスのための汎用的な代替品ではありません。彼らはequals,hashCodeおよびcompareToのようなメソッドを定義しません。それはそれはメモリ位置を返します(アトミック変数が変異していることが期待されているので、彼らはハッシュテーブルキーの貧弱な選択です。)

を意味するのでしょうか?

どのJVMを使用するかによって異なりますが、通常はメモリアドレスから派生しています。他のJVMは乱数を使うだけかもしれません。

1

AtomicBooleanhashCode()(またはその点についてはequals(Object))の方法を上書きしません。それはjava.lang.Objectのデフォルト実装を使用します。この実装は、JLSによって指定されていませんが、通常は、intで表されるオブジェクトの内部アドレスを返します。

2

AtomicBooleanは、hashCode(またはequals)をオーバーライドしないため、デフォルトのObjectビヘイビアを継承します。

これは実際にはかなり意味があります。 hashCodeの主な使用例は、オブジェクトをハッシュマップのキーにすることですが、それはdangerous to mutate keys once they're in a mapです。 AtomicBoolean の主な属性はであるため、これはHashMapキーの候補になりません。

つまり、HashMapキーにする必要がある場合は、それを変更しないでください。変更するつもりがない場合は、AtomicBooleanを使用しないでください。

0

java.util.concurrent.atomic.AtomicBooleanは、オブジェクトメソッドのハッシュコードを使用します。これは、クラス内でオーバーライドされません。オブジェクトクラスのデフォルトのhascodeを使用します。

関連する問題