0

私は自分のプロジェクトで作業しています (EMF Compare も使用しています)。使用しているオブジェクトごとに一意の ID を保持する必要があるため、IdentityHashCode を使用することにしました。私が理解している限り、この値はコンパイルを通じて同じです。

オブジェクトを別のクラスのメソッドのパラメーターとして指定しましたが、ハッシュコードを取得しようとすると、オブジェクトの値を出力したときに表示されるものとは異なります。

このようなもの:

System.out.println("The Object is: "+obj)

System.out.println("The hash ID is: +Integer.toHexString(System.identityHashCode(obj)));

しかし、結果として私はこれを得ます:

オブジェクトは次のとおりです。***xxxxxxxxxxxxxx***.EntityImpl@18e588c (name: Comment) has been removed.

ハッシュ ID は次のとおりです。1ec1758

ご覧のとおり、2 つの値 (18e588c1ec1758) はまったく異なりますが、その理由はわかりません。これまで私が行った(そしてそれが機能する)唯一のことは、オブジェクトの文字列を取得し、部分文字列メソッドを使用して取得することです18e588c(この例の場合)

回答をいただければ幸いです。

4

1 に答える 1

5

使用しているオブジェクトごとに一意の ID を保持する必要があるため、IdentityHashCode を使用することにしました。私の知る限り、この値はコンパイルでも同じです。

いいえ。コンパイルとは関係ありません。また、一意であるとは限りません。

何をしようとしているのかは明確ではありませんが、ハッシュコードを一意であると見なすべきではありません.一意であるとは限りません.

Object.hashCodeドキュメントでは次のように指定されています。

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。

しかし、それはそれを保証することと同じことではありません。

呼び出しの結果にも混乱しています-あなたtoString()のクラスは実際に をオーバーライドし、アイデンティティハッシュコードを使用するのではなく、オーバーライドされる可能性のあるメソッドhashCode()を呼び出していると思われます。Object.toString()hashCode()

クラス Object の toString メソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@'、およびオブジェクトのハッシュ コードの符号なし 16 進数表現で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。

getClass().getName() + '@' + Integer.toHexString(hashCode())

を呼び出すobj.hashCode()と、 によって表示されるのと同じ値が表示されtoStringます。

于 2013-06-21T12:23:28.453 に答える