java List集合中泛型为对象时 containsAll方法

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

 

猜你喜欢

转载自blog.csdn.net/qq_30285985/article/details/80368928