[英]Can hashcode collision affect equals in Java?
hashCode()
協定允許不同的對象具有相同的哈希碼。 從文件 :
根據equals(java.lang.Object)方法,如果兩個對象不相等,則不需要在兩個對象中的每個對象上調用hashCode方法必須產生不同的整數結果。
同時,在Eclipse中,如果使用函數Source-> Generate hashCode()並等於,則將得到如下內容:
package test1;
public class j1 {
private int a;
private int b;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals(Object obj) {
//compare hashcode
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
j1 other = (j1) obj;
if (a != other.a)
return false;
if (b != other.b)
return false;
return true;
}
}
在equals()函數中,我們首先比較this
和obj
哈希碼,如果它們具有相同的哈希碼,則equals()返回true。 但是該文檔說,兩個不同的對象可能具有不同的哈希碼,這將影響equals()
的正確性。 我只是想不通這個問題。
在equals()函數中,我們首先比較this和obj的哈希碼,如果它們具有相同的哈希碼,則equals()返回true。
否, if (this == obj)
不比較兩個對象的哈希碼。 它檢查this
和obj
是否引用相同的Object
,在這種情況下它們也必須相等(因為任何Object
都應等於其自身),因此在這種情況下不需要執行以下所有的equals
邏輯。
另一方面,如果this != obj
,則this
和obj
指的是不同的Object
,但是根據equals
的邏輯,它們可能仍然彼此equals
。 如果equals
的邏輯返回true
,則契約要求它們必須具有相同的hashCode()
。
this == obs
上的調用不比較哈希碼。 它比較對象的參考。 基本上檢查您是否像這樣使用它
this.equals(this)
是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.