2012-05-18 133 views
4

雖然兩個不同的對象可能具有相同的哈希碼,但是,System.identityHashCode()似乎會返回該對象的內存指針。我猜在32位JVM實現中可能沒有例外,包括Sun JDK,Open JDK。雖然我沒有檢查源代碼。在實踐中,我是否可以假設與System.identityHashCode()相同的兩個對象是相同的?我可以假設兩個具有相同System.identityHashCode的對象是相同的嗎?

+4

爲什麼不用'=='來比較它們,而不是*表示它們是相同的。 –

+0

如果你喜歡編寫不可移植的代碼,答案是「是」:) – dasblinkenlight

+0

我不會將應用程序邏輯基於方法的內部實現,尤其是考慮到優秀的Javadoc for Object.hashcode。 – Perception

回答

3

簡短的回答是否定的。

按照該documentationSystem.identityHashCode(Object) ...

返回相同的散列碼爲給定的對象會被默認的方法的hashCode(返回),給定對象的類是否重寫hashCode( )。

那麼接下來讓檢查Object.hashCode()documentation ...

儘可能多是合理可行的,由Object類定義的hashCode方法不會返回不同的整數針對不同的對象。 (這一般是通過將該對象的內部地址轉換成一個整數來實現的,但不是由在Java編程語言需要這種實現技巧。)

6

答案是否定的。

System.identityHashCode()只需返回Object.hashCode()

返回相同的散列碼爲給定的對象會被默認的方法的hashCode(返回 ),給定對象的 類是否重寫hashCode()。空引用的哈希碼爲零。

雖然Object.hashCode()

多達是合理可行,通過 類對象定義的hashCode方法不會返回針對不同的對象不同的整數。 (此 通常通過轉換所述 對象的內部地址轉換成一個整數來實現的,但是這種實現的技術是不被的JavaTM編程語言不需要 。)

然而,存在孫bug JDK指出兩個對象可以返回相同的哈希碼。

+1

+1以供參考。 – Jeremy

1

有你的問題

首先,這是什麼System.identityHashCode(Object)返回只有兩件事情。

返回與默認方法hashCode()返回給定對象相同的哈希代碼,無論給定對象的類是否覆蓋hashCode()。空引用的哈希碼爲零。

二,什麼是哈希碼規則時比較兩個對象的相等。

合同說,如果兩個對象是相等的使用equals(Object)方法,就應該有相同的hashCode,但如果兩個對象具有相同的哈希碼,他們不一定相等。

相關問題