==和eauals的區別

一直對==和equals方法判斷相等很模糊。今天又仔細看了下。留個紀念


網上一直有人說

[quote]==比較的是內存地址;
equals比較的是內容。[/quote]


這種說法是不嚴謹的。
首先我們看下java中object中的源碼。因爲所以的類都繼承了object這個類。那麼方法也是了
object.java中的eauqls方法如下:


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


看完代碼發現。在object類中。equals和==是沒有任何區別的。都比較的是內存地址。也就是說。都是比較兩個引用是否指向同一個對象。是則返回true。否則返回false

那爲什麼很多人說比較對象呢。因爲很多都雖然繼承了object類。但是它們很多都重寫了equals方法

最典型的就是string類
看string類中的equals方法


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;
}




根據引用取出內容。然後逐個比較。相同返回true。否則false
現在明白了。原來根據類的不同equals方法比較的東西也不盡相同。
再看list的抽象類AbstractList

public boolean equals(Object o) {

if (o == this)
return true;
if (!(o instanceof List))
return false;

ListIterator e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while(e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}

return !(e1.hasNext() || e2.hasNext());

}


同樣重寫了equals方法。然後迭代判斷兩個list是否相同。
所以再有人問你==和equals方法的區別。你就不會迷糊了吧。
發佈了21 篇原創文章 · 獲贊 1 · 訪問量 3574
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章