今天遇到一個坑,java list集合中存入對象,然後用containsAll方法進行比較時, 總是傳回 false;
檢視源碼得知:
public boolean containsAll(Collection> c) {
for (Object e : c)
if (!contains(e))
return false;
return true;
}進入 contains(e)
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
進入indexOf(o)
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
進入equals
public boolean equals(Object obj) {
return (this == obj);
}
到這裡發現到equals調用的是Object.java 的equals方法,是以這裡如果是對象的話,這麼比較,是在比較位址,是以一定會false;
是以加入是User 對象的話,在User對象中重寫equals 方法即可;
例如:
public boolean equals(Object obj) {
if (obj instanceof DtAnswer) {
DtAnswer u = (DtAnswer) obj;
return this.id.equals(u.id);
}
return super.equals(obj);
}
再此:謝謝原文作者,https://www.cnblogs.com/tony-yang-flutter/p/list_contains.html