使用java.util.List的containsAll()方法可能导致的问题

今天在偶然之间发现了一个bug,原因居然是使用了containsAll()方法,这个问题很简单,看以下代码就能发现很大的问题。

java 复制代码
package collection;

import java.util.ArrayList;
import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
public class ListExample {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(2);
        list.add(3);
        list.add(3);

        List<Integer> integerList = new ArrayList<>();

        integerList.add(3);
        integerList.add(3);
        integerList.add(3);

        System.out.println(list);
        System.out.println(integerList);
        System.out.println(list.containsAll(integerList));
    }

}

上面的结果最后一行打印的是true,因为containsAll()方法的作用类似于遍历指定的集合c,通过contains()比较集合中每个元素,如果有元素不包含在当前的list对象中,就返回false,否则返回true,为了便于理解,写了以下伪代码

java 复制代码
public interface List<E> extends Collection<E> {

    public boolean containsAll(Collection<?> c) {
        for (Object o : c) {
            if (!this.contains()) {
                return false;
            }
        }
        
        return true;
    }

}

因此,文章给出的代码等价于

java 复制代码
package collection;

import java.util.ArrayList;
import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
public class ListExample {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(2);
        list.add(3);
        list.add(3);

        System.out.println(list);
        System.out.println(integerList);
        System.out.println(list.contains(3));
    }

}

总结:这篇文章分享了一下项目中遇到的关于containsAll()方法使用时应该考虑到的问题,当比较的两个list中元素个数相同时,可以用equals()方法替代containsAll()方法使用,但是在使用之前需要对两个集合排序(因为List的源码里已经说明了,只有但集合元素的个数和顺序都一样才返回true)。

复制代码
/**
 * Compares the specified object with this list for equality.  Returns
 * true if and only if the specified object is also a list, both
 * lists have the same size, and all corresponding pairs of elements in
 * the two lists are equal.  (Two elements e1 and
 * e2 are equal if (e1==null ? e2==null :
 * e1.equals(e2)).)  In other words, two lists are defined to be
 * equal if they contain the same elements in the same order.  This
 * definition ensures that the equals method works properly across
 * different implementations of the List interface.
 *
 * @param o the object to be compared for equality with this list
 * @return true if the specified object is equal to this list
 */
boolean equals(Object o);

好了,文章就分享到这里了,感谢阅读~

相关推荐
名字还没想好☜4 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
一壶浊酒..7 小时前
Scrape Webpack练习
开发语言·javascript·webpack
ZJH__GO8 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆8 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光8 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林8 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
命运之光8 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人9 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
marvelyu9 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库