行业资讯 2025年08月6日
0 收藏 0 点赞 886 浏览 3774 个字
摘要 :

文章目录 1.比较两个列表是否相等 1.1. 先排序再比较 1.2. 使用Commons Collections 1.3. 在单元测试中比较列表 2.比较两个列表- 查找额外的元素 2.1. 纯Java 2.2. ……




  • 1.比较两个列表是否相等
    • 1.1. 先排序再比较
    • 1.2. 使用Commons Collections
    • 1.3. 在单元测试中比较列表
  • 2.比较两个列表- 查找额外的元素
    • 2.1. 纯Java
    • 2.2. 使用Stream API
    • 2.3. 使用CollectionUtils.removeAll()
  • 3.比较两个列表 – 查找缺失的项
  • 4.比较两个列表 – 查找共同的项

学习在Java中比较两个ArrayList以查找它们是否包含相同的元素。如果这两个列表不相等,我们将找到它们之间的差异。我们还将学习如何找到每个列表中的共同项和不同项。

请注意,两个列表之间的差异等于第三个列表,其中包含了额外的元素或缺少的元素。

1.比较两个列表是否相等

1.1. 先排序再比较

以下的Java程序用于测试给定的两个列表是否相等。为了测试它们是否相等,我们需要对两个列表进行排序,然后使用equals()方法比较它们。

List.equals()方法仅在以下情况下返回true:

  • 两个列表的大小相同
  • 它们包含完全相同顺序的相同元素
ArrayList<String> list = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"c\"));
ArrayList<String> equalList = new ArrayList<>(Arrays.asList(\"c\", \"b\", \"a\"));
ArrayList<String> diffList = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"d\")); //c and d are changed
Collections.sort(list);
Collections.sort(equalList);
Assertions.assertTrue(list.equals(equalList));
Collections.sort(diffList);
Assertions.assertFalse(list.equals(diffList));

1.2. 使用Commons Collections

如果项目中依赖于commons-collections4,我们可以使用CollectionUtils.isEqualCollection() API。这个API会比较两个列表的项,忽略它们的顺序。

boolean result = CollectionUtils.isEqualCollection(firstList, secondList);

1.3. 在单元测试中比较列表

如果在单元测试中检查列表的相等性,可以考虑使用Matchers.containsInAnyOrder()。

Assertions.assertThat(firstList, Matchers.containsInAnyOrder( secondList.toArray() ));

2.比较两个列表- 查找额外的元素

在以下示例中,我们将找到存在于list1中但不在list2中的项。

2.1. 纯Java

如果两个ArrayList不相等,且我们想找出第一个列表中相对于第二个列表的额外元素,可以使用removeAll()方法。它会从第一个列表中移除第二个列表中的所有元素,只留下第一个列表中的额外元素。

ArrayList<String> listOne = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"c\", \"d\"));
ArrayList<String> listTwo = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"e\", \"f\"));
//listOne中额外项
listOne.removeAll(listTwo);
System.out.println(listOne);  //[c, d]

2.2. 使用Stream API

我们可以迭代第一个列表的列表项,并在第二个列表中搜索所有元素。如果该元素存在于第二个列表中,就从第一个列表中将其移除。在流操作之后,将这些项收集到一个新的列表中。

List<String> listOfAdditionalItems = listOne.stream()
    .filter(item -> !listTwo.contains(item))
    .toList();
Assertions.assertTrue(CollectionUtils.isEqualCollection(List.of(\"c\", \"d\"), listOfAdditionalItems));

2.3. 使用CollectionUtils.removeAll()

CollectionUtils.removeAll(list1, list2) 返回一个包含list1中不在list2中的所有元素的集合。CollectionUtils类是Apache commons-collection4库的一部分。

List<String> listOfAdditionalItems = (List<String>) CollectionUtils.removeAll(listOne, listTwo);
Assertions.assertTrue(CollectionUtils.isEqualCollection(List.of(\"c\", \"d\"), listOfAdditionalItems));

3.比较两个列表 – 查找缺失的项

要获取在list1中缺失但在list2中存在的元素,可以反转上一节中的解决方案。

纯Java的解决方案如下:

ArrayList<String> listOne = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"c\", \"d\"));
ArrayList<String> listTwo = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"e\", \"f\"));
//missing items in listOne
listTwo.removeAll(listOne);
System.out.println(listTwo);  //[e, f]

使用Stream API的解决方案如下:

List<String> listOfMissingItems = listTwo.stream()
    .filter(item -> !listOne.contains(item))
    .toList();
Assertions.assertTrue(CollectionUtils.isEqualCollection(List.of(\"e\", \"f\"), listOfMissingItems));

同样,将List的顺序反转后使用CollectionUtils.removeAll()。

List<String> listOfMissingItems = (List<String>) CollectionUtils.removeAll(listTwo, listOne);
Assertions.assertTrue(CollectionUtils.isEqualCollection(List.of(\"e\", \"f\"), listOfMissingItems));

4.比较两个列表 – 查找共同的项

要查找两个ArrayList中的共同元素,可以使用List.retainAll()方法。这个方法仅保留在该列表中的元素,这些元素包含在作为方法参数传递的指定ArrayList中。

ArrayList<String> listOne = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"c\", \"d\"));
ArrayList<String> listTwo = new ArrayList<>(Arrays.asList(\"a\", \"b\", \"e\", \"f\"));
//listOne和listTwo中的共同项。
listOne.retainAll(listTwo);     //[a, b]

我们也可以使用Stream API来查找所有共同的项,如下所示:

List<String> listOfCommonItems = listOne.stream()
    .filter(item -> listTwo.contains(item))
    .toList();
Assertions.assertTrue(CollectionUtils.isEqualCollection(List.of(\"a\", \"b\"), listOfCommonItems));

此外,还可以使用CollectionUtils.intersection()方法,它返回两个列表中的共同元素。

List<String> listOfCommonItems = (List<String>) CollectionUtils.intersection(listTwo, listOne);
Assertions.assertTrue(CollectionUtils.isEqualCollection(List.of(\"a\", \"b\"), listOfCommonItems));

以上就是Java中比较两个List列表的全部内容。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9324.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号