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

本文探讨了Java中List集合使用containsAll方法时遇到的问题,深入解析了该方法的内部实现,并指出了当比较对象时如何正确重写equals方法来避免误判。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值