如何对比两个Java ArrayList 找出第二个数组中独有的新值
解决方案
你要实现的是两个集合的差集运算(取arrB相对于arrA的差集),下面提供几种不同适用场景的实现方式:
方法1:直接使用集合自带的removeAll方法(最简洁,适合小数据量)
直接复制arrB的所有元素到新集合,再移除所有arrA中存在的元素即可:
// 初始化第三个数组存储结果 ArrayList<String> result = new ArrayList<>(arrB); result.removeAll(arrA);
这种方式代码量最少,但是removeAll底层是逐个遍历比对,时间复杂度是O(n*m),如果两个集合元素量过万的情况下效率会偏低。
方法2:用HashSet优化查询效率(适合大数据量场景)
把arrA的元素先存入HashSet,利用HashSet O(1)的查询特性过滤arrB的元素,时间复杂度可以降到O(n+m):
// 先把arrA转成HashSet降低查询成本 Set<String> arrASet = new HashSet<>(arrA); ArrayList<String> result = new ArrayList<>(); for (String item : arrB) { if (!arrASet.contains(item)) { result.add(item); } }
方法3:使用Java 8+ Stream流式写法(代码简洁且效率较高)
如果你的项目使用JDK8及以上版本,可以用Stream写出更简洁的流式代码,效率和HashSet方案一致:
Set<String> arrASet = new HashSet<>(arrA); // 通用List返回写法 List<String> result = arrB.stream() .filter(item -> !arrASet.contains(item)) .collect(Collectors.toList()); // 如果需要明确返回ArrayList类型,可以用下面的收集写法 // ArrayList<String> result = arrB.stream() // .filter(item -> !arrASet.contains(item)) // .collect(Collectors.toCollection(ArrayList::new));
你提供的测试数据用以上三种方案运行,最终得到的结果都是["5", "X", "6", "7"],符合需求。
内容的提问来源于stack exchange,提问作者UserOfStackOverFlow
相关产品推荐
相关产品推荐

