2013-05-28 36 views
4

@和#之間的區別是什麼toString的輸出?我有一個不覆蓋toString的Java對象。在通過日誌文件的樣子,我看到一些線Java和toString輸出中@和#之間的區別?

[email protected] 

,而另一條線路上(這個人是從休眠射出)我看到

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

有沒有辦法在這兩個數字之間進行轉換,以確定它們是否是相同的實例?

+0

Andrzej說,這是內部的東西。但'@'是'Integer.toHexString(System.identityHashCode(object))'的結果之後。但是我可能會錯,因爲我沒有任何基礎來證明:P –

+1

您的Order類是否使用UUIDGenerator分配主鍵?任何機會51a4cfa1e4b047bf2ab9b796是訂單的主鍵? – Jimothy

回答

4

這兩個數字都是來自兩個不同系統的任意內部細節。既不能保證它們是什麼,也不能保證它們是如何制定出來的。

如果您確實想出了某種翻譯,它會非常脆弱,並且在任何環境變化(不同的補丁版本的庫/ JVM,以不同大小的堆等運行)下沒有任何警告地突然中斷。 )。我懷疑這兩者之間可能沒有聯繫。我知道第一個數字是由JVM通常根據對象佔用的實際內存位置生成的。第二種是由Hibernate生成的某種散列 - 它不能訪問與JVM相同的信息,因此可能不會使用相同的輸入。

0

如果你正試圖確定2個對象引用指向同一個實例,使用Object.equals

的等於Object類的方法實現對象上最挑剔的 可能等價關係;也就是說,對於任何非空 引用值x和y,當且僅當x 和y引用同一對象(x == y的值爲true)時,此方法返回true。

如果你只是想你的日誌文件,以表現出足夠的信息,以確定它們是否是相同的實例,覆蓋toString提供足夠的信息,或更改您的記錄信息。

---- ----編輯

要按照@Jimothy評論澄清,用order1 == order2代替.equals

+0

更好地使用'=='。 「對象」確實如此。equals()'是等價的,但是如果一個子類重載equals()(當使用Hibernate時,它通常應該),那麼這就不再成立。 – Jimothy

+0

@Jimothy,同意了。我聲明object equals等於Object.equals是什麼的引語,但是我看到我不清楚這一點。 – Lucas

1

散列格式,你猜測,來自休眠。爲了回答自己的問題,Hibernate在幾個地方記錄了實體/類的名稱,一個散列符號,然後是實體的主鍵。所以com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796是與主鍵51a4cfa1e4b047bf2ab9b796訂單。

正如其他人所說,如果你想檢查兩個對象是否是同一個實例,==將比這些對象的字符串表示更簡單可靠。

相關問題