2012-12-20 33 views
1

通常情況下,當有對象時,如果兩個哈希碼相同,則等於方法等於另一個相同類型的對象。整數等於方法

Integer是否以相同的方式通過比較哈希碼或以不同的方式工作?

+1

OpenJDK比較整數值:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Integer.java – irrelephant

+0

爲什麼它很重要您? –

+0

@AleksanderGralak我是個書呆子! –

回答

4

具有相同散列碼的兩個對象不需要是equals()

兩個對象equals()必須具有相同的哈希碼。

這基本上意味着你可能有(偶爾)散列碼衝突。


Integerequals()方法簡單地比較int值它與其他Integerint值換行。哈希代碼不會進入它。


注意,equals()hashcode aggrement沒有嚴格要求,但通過使用內部Hashtable,例如各種java.util.Hashxxx類的許多JDK類依靠。

+0

@Boemian但如果metod等於認爲兩個對象相等,哈希碼必須是兩個對象相同的值 –

+2

@MarcRasmussen這正是我所說的。我已經重新措辭我的答案,使其更清晰 – Bohemian

2

Integer equals()方法將int值與==運算符進行比較,請參見下面的Integer.equals()方法的代碼。

public boolean equals(Object obj) { 
    if (obj instanceof Integer) { 
     return value == ((Integer)obj).intValue(); 
    } 
    return false; 
} 
2

爲什麼對你很重要?

Integer#equals檢查兩個int值是否相等,而不僅僅是引用。所以實際的Integer對象可能會有所不同(不同的參考),但是相同。

4

如果您檢查Integer.java包裝類的來源,您可以發現重寫了equals方法來檢查兩個Integer對象是否具有相同的int值。

public boolean equals(Object obj) { 
     if (obj instanceof Integer) { 
      return value == ((Integer)obj).intValue(); 
     } 
     return false; 
} 

所以你可以說JDK比較了對象內部的整數值。

+0

只是一個更正。 java.lang.Integer不從Object繼承。所以equals方法不是重寫的方法。這只是一個成員方法。 – Raheel

+0

@Raheel您可能需要檢查[here](http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html)。 – Jayamohan

+0

感謝您的支持 – Raheel