1. 程式人生 > 實用技巧 >最詳細的equal和hashcode詳解

最詳細的equal和hashcode詳解

java.lang.Object類中有兩個非常重要的方法:

1.publicbooleanequals(Object obj)

2.publicinthashCode()

Object類是類繼承結構的基礎,是每一個類的父類。所有的物件,包括陣列,都實現了在Object類中定義的方法。

equals()方法詳解

equals()方法是用來判斷其他的物件是否和該物件相等.

equals()方法在object類中定義如下:

public boolean equals(Object obj) {

return (this == obj);

}

很明顯是對兩個物件的地址值進行的比較(即比較引用是否相同)。但是我們知道,String 、Math、Integer、Double等這些封裝類在使用equals()方法時,已經覆蓋了object類的equals()方法。

比如在String類中如下:

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

很明顯,這是進行的內容比較,而已經不再是地址的比較。依次類推Math、Integer、Double等這些類都是重寫了equals()方法的,從而進行的是內容的比較。當然,基本型別是進行值的比較。

它的性質有:

  • 自反性(reflexive)。對於任意不為null的引用值x,x.equals(x)一定是true

  • 對稱性(symmetric)。對於任意不為null的引用值xy,當且僅當x.equals(y)true時,y.equals(x)也是true

  • 傳遞性(transitive)。對於任意不為null的引用值xyz,如果x.equals(y)true,同時y.equals(z)true,那麼x.equals(z)一定是true

  • 一致性(consistent)。對於任意不為null的引用值xy,如果用於equals比較的物件資訊沒有被修改的話,多次呼叫時x.equals(y)要麼一致地返回true要麼一致地返回false

  • 對於任意不為null的引用值xx.equals(null)返回false

對於Object類來說,equals()方法在物件上實現的是差別可能性最大的等價關係,即,對於任意非null的引用值xy,當且僅當xy引用的是同一個物件,該方法才會返回true

需要注意的是當equals()方法被override時,hashCode()也要被override。按照一般hashCode()方法的實現來說,相等的物件,它們的hash code一定相等。

轉載:https://blog.csdn.net/zj15527620802/article/details/88547914