2

同じクラスの o1 と o2 という 2 つのオブジェクトがあります。

の場合o1.hashcode() == o2.hashcode()、それらが同じオブジェクトであると言えますか?

以外に、シングルトンo1==o2に伝える他の方法はありますか。

4

4 に答える 4

4

クラスのインスタンスが 1 つしかない場合、==と のequals比較は常に を返しtrueます。

ただし、 はhashcode異なるオブジェクトで等しい可能性があるため、ハッシュコードが等しいだけでは等しいとは限りません。

ここhashcodeにとequalsコントラクトのわかりやすい説明があります。

インスタンスが等しいと見なされるだけで、シングルトンがあることを確認するには、等しいかどうかを確認するだけでは不十分です。

Java クラスの単一のインスタンスが必要な場合は、静的メンバーとメソッドを使用することをお勧めします。

ここでは、シングルトンへのいくつかのアプローチが示されています。

EDIT:エモリーが指摘したように、実際にはオーバーライドequalsしてランダムなものを返すことができ、必要な反射率(x.equals(x) == true)に違反する可能性があります。Java では演算子をオーバーライドできない== ため、同一のオブジェクトを特定する唯一の信頼できる方法です。

于 2012-10-20T10:38:12.730 に答える
3

いいえ、異なるオブジェクトが同じを持つことができますhashCode()

"hypoplankton".hashCode()
"unheavenly"  .hashCode()

どちらも同じ427589249ハッシュ値を返しますが、明らかに等しくはありません。

于 2012-10-20T10:44:52.140 に答える
2

あなたの質問(タイトルから)はhashCode()「同じオブジェクトに対して常に同じ値を返す」ようです...答えはnoです。

実装は自由に何でも返すことができますが、適切に動作させるには、同じオブジェクトに対して同じものを返す必要があります。たとえば、これは有効ですが、貧弱な実装です。

@Override
public int hashCode() {
    return (int) (Math.random() * Integer.MAX_VALUE);
}    
于 2012-10-20T10:51:24.577 に答える