簡體   English   中英

哈希碼沖突會影響Java中的均值嗎?

[英]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()函數中,我們首先比較thisobj哈希碼,如果它們具有相同的哈希碼,則equals()返回true。 但是該文檔說,兩個不同的對象可能具有不同的哈希碼,這將影響equals()的正確性。 我只是想不通這個問題。

在equals()函數中,我們首先比較this和obj的哈希碼,如果它們具有相同的哈希碼,則equals()返回true。

否, if (this == obj) 比較兩個對象的哈希碼。 它檢查thisobj是否引用相同的Object ,在這種情況下它們也必須相等(因為任何Object都應等於其自身),因此在這種情況下不需要執行以下所有的equals邏輯。

另一方面,如果this != obj ,則thisobj指的是不同的Object ,但是根據equals的邏輯,它們可能仍然彼此equals 如果equals的邏輯返回true ,則契約要求它們必須具有相同的hashCode()

this == obs上的調用不比較哈希碼。 它比較對象的參考。 基本上檢查您是否像這樣使用它

this.equals(this)是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM