4

@ と # の違いは何ですか toString の出力に署名しますか? toString をオーバーライドしていない Java オブジェクトがあります。ログファイルを見ると、いくつかの行に表示されます

com.foo.model.orders.Order@10eb9e65

別の行にいる間(これは休止状態から出力されます)わかりました

com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796

これらの 2 つの数値を変換して、それらが同じインスタンスであるかどうかを判断する方法はありますか?

4

3 に答える 3

4

いいえ。

これらの数値は両方とも、2 つの異なるシステムからの恣意的な内部詳細にすぎません。どちらも、それらが何であるか、またはそれらがどのように機能するかについて保証しません.

なんらかの変換を思いついたとしても、状況の変化 (ライブラリ/JVM の異なるパッチ バージョン、異なるサイズのヒープでの実行など) の下では、非常に脆く、警告なしに破損する傾向があります。とにかく、おそらく2つの間にリンクはないと思います。最初の数値は、通常、オブジェクトが占有する実際のメモリ位置に基づいて JVM によって生成されることを知っています。2 つ目は、Hibernate によって生成されたある種のハッシュです。これは、JVM と同じ情報にアクセスできないため、同じ入力を使用しない可能性があります。

于 2013-05-28T17:00:46.420 に答える
1

ご想像のとおり、ハッシュ形式は Hibernate に由来します。コメントからあなたの質問への私自身の質問に答えるために、Hibernate はいくつかの場所でエンティティ/クラス名、ハッシュ記号、エンティティの主キーをログに記録します。Order com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796with primary key も同様51a4cfa1e4b047bf2ab9b796です。

他の人が述べているように、2 つのオブジェクトが同じインスタンスであるかどうかを確認したい場合は==、文字列表現を比較するよりも簡単かつ確実に行います。

于 2013-05-28T17:23:10.527 に答える
0

2 つのオブジェクト参照が同じインスタンスを参照しているかどうかを判断しようとしている場合は、Object.equals

クラス Object の equals メソッドは、オブジェクトに対して最も識別可能な等価関係を実装します。つまり、null 以外の参照値 x と y の場合、このメソッドは、x と y が同じオブジェクトを参照している (x == y の値が true) 場合にのみ true を返します。

同じインスタンスであるかどうかを判断するのに十分な情報をログ ファイルに表示するだけの場合は、 をオーバーライドしtoStringて十分な情報を提供するか、ロガー メッセージを変更します。

- - 編集 - -

@Jimothy コメントごとに明確にするには、order1 == order2代わりに使用します.equals

于 2013-05-28T17:03:30.317 に答える