@和#之間的區別是什麼toString的輸出?我有一個不覆蓋toString的Java對象。在通過日誌文件的樣子,我看到一些線Java和toString輸出中@和#之間的區別?
[email protected]
,而另一條線路上(這個人是從休眠射出)我看到
com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
有沒有辦法在這兩個數字之間進行轉換,以確定它們是否是相同的實例?
@和#之間的區別是什麼toString的輸出?我有一個不覆蓋toString的Java對象。在通過日誌文件的樣子,我看到一些線Java和toString輸出中@和#之間的區別?
[email protected]
,而另一條線路上(這個人是從休眠射出)我看到
com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
有沒有辦法在這兩個數字之間進行轉換,以確定它們是否是相同的實例?
第
這兩個數字都是來自兩個不同系統的任意內部細節。既不能保證它們是什麼,也不能保證它們是如何制定出來的。
如果您確實想出了某種翻譯,它會非常脆弱,並且在任何環境變化(不同的補丁版本的庫/ JVM,以不同大小的堆等運行)下沒有任何警告地突然中斷。 )。我懷疑這兩者之間可能沒有聯繫。我知道第一個數字是由JVM通常根據對象佔用的實際內存位置生成的。第二種是由Hibernate生成的某種散列 - 它不能訪問與JVM相同的信息,因此可能不會使用相同的輸入。
如果你正試圖確定2個對象引用指向同一個實例,使用Object.equals
的等於Object類的方法實現對象上最挑剔的 可能等價關係;也就是說,對於任何非空 引用值x和y,當且僅當x 和y引用同一對象(x == y的值爲true)時,此方法返回true。
如果你只是想你的日誌文件,以表現出足夠的信息,以確定它們是否是相同的實例,覆蓋toString
提供足夠的信息,或更改您的記錄信息。
---- ----編輯
要按照@Jimothy評論澄清,用order1 == order2
代替.equals
散列格式,你猜測,來自休眠。爲了回答自己的問題,Hibernate在幾個地方記錄了實體/類的名稱,一個散列符號,然後是實體的主鍵。所以com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
是與主鍵51a4cfa1e4b047bf2ab9b796
訂單。
正如其他人所說,如果你想檢查兩個對象是否是同一個實例,==
將比這些對象的字符串表示更簡單可靠。
Andrzej說,這是內部的東西。但'@'是'Integer.toHexString(System.identityHashCode(object))'的結果之後。但是我可能會錯,因爲我沒有任何基礎來證明:P –
您的Order類是否使用UUIDGenerator分配主鍵?任何機會51a4cfa1e4b047bf2ab9b796是訂單的主鍵? – Jimothy