網上一直有人說
[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方法的區別。你就不會迷糊了吧。