最詳細的equal和hashcode詳解
java.lang.Object類中有兩個非常重要的方法:
1.public
boolean
equals(Object obj)
2.public
int
hashCode()
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
的引用值x
和y
,當且僅當x.equals(y)
是true
時,y.equals(x)
也是true
。 -
傳遞性(transitive)。對於任意不為
null
的引用值x
、y
和z
,如果x.equals(y)
是true
,同時y.equals(z)
是true
,那麼x.equals(z)
一定是true
。 -
一致性(consistent)。對於任意不為
null
的引用值x
和y
,如果用於equals比較的物件資訊沒有被修改的話,多次呼叫時x.equals(y)
要麼一致地返回true
要麼一致地返回false
。 -
對於任意不為
null
的引用值x
,x.equals(null)
返回false
。
對於Object
類來說,equals()
方法在物件上實現的是差別可能性最大的等價關係,即,對於任意非null
的引用值x
和y
,當且僅當x
和y
引用的是同一個物件,該方法才會返回true
。
需要注意的是當equals()
方法被override時,hashCode()
也要被override。按照一般hashCode()
方法的實現來說,相等的物件,它們的hash code一定相等。
轉載:https://blog.csdn.net/zj15527620802/article/details/88547914