ArrayList添加元素:如何借助集合API便捷跳过重复项实现列表合并
实现ArrayList去重合并的便捷方法
当然有啦!你完全不用自己写繁琐的遍历逻辑,Java自带的API或者常用的第三方工具库就能用几行代码搞定这个需求,下面给你几种实用的方案:
1. 原生Java 8+ Stream API(无需额外依赖)
这是最推荐的原生解决方案,用Stream的过滤和遍历操作就能完成,代码简洁易读:
// 过滤arryTwo中已存在于arryOne的元素,再添加到arryOne arryTwo.stream() .filter(item -> !arryOne.contains(item)) .forEach(arryOne::add);
注:
contains()方法底层虽然还是基于遍历,但代码层面你完全不需要自己实现循环逻辑,借助API就完成了需求。
2. 利用Set去重(兼顾顺序与性能)
如果你在意性能(比如集合元素很多时,contains()的遍历效率较低),可以借助LinkedHashSet来同时实现去重和保留原集合的顺序:
// 先把arryOne的元素放入LinkedHashSet(自动去重+保序) Set<String> tempSet = new LinkedHashSet<>(arryOne); // 添加arryTwo的所有元素,重复元素会被自动忽略 tempSet.addAll(arryTwo); // 再把Set转回ArrayList(如果需要修改原arryOne,直接赋值即可) arryOne = new ArrayList<>(tempSet);
这种方法的优势在于HashSet的contains()是O(1)时间复杂度,比ArrayList的O(n)更高效,适合处理大数据量的集合。
3. 引入Guava工具库(简化代码)
如果你的项目已经引入了Guava库,可以用它的集合工具类进一步简化代码:
// 合并两个集合并去重,返回一个不可变的Set Set<String> mergedSet = Sets.union(Sets.newHashSet(arryOne), Sets.newHashSet(arryTwo)); // 转成ArrayList arryOne = new ArrayList<>(mergedSet);
如果需要保留顺序,同样换成LinkedHashSet即可:
Set<String> mergedSet = new LinkedHashSet<>(arryOne); mergedSet.addAll(arryTwo); arryOne = new ArrayList<>(mergedSet);
4. Java 17+ 更简洁的新API
如果你使用的是Java 17及以上版本,可以用Stream的concat()和distinct()生成新的无重复集合:
// 生成新的不可变List List<String> mergedList = Stream.concat(arryOne.stream(), arryTwo.stream()) .distinct() .toList(); // 如果需要可变的ArrayList,改用collect方法 List<String> mutableMergedList = Stream.concat(arryOne.stream(), arryTwo.stream()) .distinct() .collect(Collectors.toCollection(ArrayList::new));
内容的提问来源于stack exchange,提问作者Timothy Clotworthy
相关产品推荐
相关产品推荐

