java equals詳解

首先equals方法是object類的方法,所有的類都默認繼承object類,object類也就是所有類的超類。

如果兩個對象進行相等比較,需要調用x.equals(y),但是如果沒有重寫equals方法,那麼默認使用的是object類的equals方法

public boolean equals(Object obj) {
    return (this == obj);
}

而在object中的equals方法是這樣定義的,如果引用地址相同,那麼就證明兩個對象相同,這樣遠遠是不夠的。

String 的equals方法:

如下:重寫object的equals方法,首先進行內存地址的比較,然後進行數據類型的比較,然後進行字符串長度的比較,最後再進行每一個字符的比較

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

在實際中,例如說比較兩個自定義的對象,那麼就需要進行equals方法的重寫了

equals方法遵循以下特性:

1.自反性:對於任何非空的引用x,x.equals(x) 應該返回true

2.對稱性,對於任何非空引用x,y ,都應該遵循x.equsla(y)=true 和y.equals(x)=true

3.傳遞性:對於任何引用x,y,z 如果x.equsla(y)=true,那麼y.equals(x)=true

4.一致性:如果X和y的引用沒有發生變化,那麼反覆調用x.equsla(y)返回的結果應該相同

5.對於任意非空引用x,x.equals(null)都應該等於false


完整的equals思路:例如x.equals(y)

1.首先檢查x==y,進行地址檢查,如果相等,這是快速的方式

2.檢查y是否等於null,如果爲null則返回false

3.檢查x與y是否是同一個類,此時存在兩種檢測方式:如果不存在子類父類關係,則可以隨意使用

(1).利用instanceof進行檢查(父類定義相等關係)

(2).利用getClass進行檢查(子類定義相等關係)

4.然後對所需要對比的屬性進行比較


如果x.equals(y) ,那麼x.hashCode和y.hashCode是一定相同的。

重寫equals方法,就需要重新定義hashcode()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章