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
相关产品推荐
相关产品推荐

