今天遇到一个坑,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