You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何提取两个List中仅存在于第二个List的唯一值

Java 提取仅在list2中存在的独有元素实现方案

以下是两种生产环境常用的实现方式,均兼顾了性能与需求匹配度:

方案1:Java 8+ Stream 实现(简洁直观)

适合使用JDK 8及以上版本的场景,代码可读性高:

import java.util.*;
import java.util.stream.Collectors;

// 你的原始List定义
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
List<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
list2.add(5);

// 核心逻辑:先把list1转成HashSet降低判断包含的时间复杂度
Set<Integer> list1Set = new HashSet<>(list1);
List<Integer> uniqueInList2 = list2.stream()
        .filter(item -> !list1Set.contains(item))
        .distinct() // 若list2本身可能有重复独有元素、要求最终结果去重则保留这行,否则可以删除
        .collect(Collectors.toList());

运行后uniqueInList2的结果就是[5],符合你的预期。

方案2:原生集合API实现(兼容低版本JDK)

适合需要兼容JDK 7及以下版本的场景,直接用集合差集能力实现:

Set<Integer> resultSet = new HashSet<>(list2);
// 移除所有在list1中存在的元素,剩下的就是list2独有的元素
resultSet.removeAll(new HashSet<>(list1));
// 如果需要返回List类型,可以转为ArrayList:List<Integer> uniqueInList2 = new ArrayList<>(resultSet);

运行后resultSet中存储的就是5。


注意事项

  • 不要直接使用ArrayList的removeAll或contains方法做判断,ArrayList的contains时间复杂度是O(n),数据量大时性能极差,转成HashSet后contains时间复杂度降到O(1),性能提升非常明显。
  • 如果你的List存储的是自定义对象而非基础类型/包装类,需要重写对象的equals()和hashCode()方法,否则元素相等判断会失效。

内容的提问来源于stack exchange,提问作者Sandesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:24:02