跳转到主内容
极星编程网:以代码为星,赴技术山海!

在Java里如何合并两个集合_Java集合合并方式说明

addAll()是最直接的ArrayList合并方式,时间复杂度O(n),不自动去重、不改变原集合顺序,需确保目标集合非null,源集合为null时需提前判空。 用
addAll()
合并两个
ArrayList
最直接 如果两个集合都是
ArrayList
,且目标集合允许重复、不关心顺序,
addAll()
是最轻量的选择。它直接在原集合末尾追加所有元素,时间复杂度 O(n),无额外对象创建开销。 常见错误是忽略返回值——
addAll()
返回
boolean
(是否发生修改),不是新集合;也有人误以为它会去重,其实完全不会。 确保目标集合非
null
,否则抛
NullPointerException
源集合可以为
null
,但调用前需判空,否则运行时报错 若需保留原集合不变,得先
new ArrayList(original)
再
addAll()
ArrayList list1 = new ArrayList<>(Arrays.asList("a", "b")); ArrayList list2 = new ArrayList<>(Arrays.asList("c", "d")); list1.addAll(list2); // list1 现在是 ["a", "b", "c", "d"]
合并时要去重?用
HashSet
或
LinkedHashSet
当需要自动过滤重复元素,又不想手动遍历判断,把集合转成
Set
是最稳妥的路径。注意:
HashSet
不保证顺序,
LinkedHashSet
保持插入顺序但略慢一点。 别直接用
TreeSet
除非你真需要排序——它强制要求元素可比较,且插入是 O(log n),整体变慢;另外,如果元素含
null
,
TreeSet
会抛
NullPointerException
。 立即学习 “ Java免费学习笔记(深入) ”; Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载
LinkedHashSet
是「去重 + 保序」的默认选择 合并后若还需 List 接口,再用
new ArrayList<>(set)
转回 原始集合若有自定义对象,确保
equals()
和
hashCode()
正确实现
Set merged = new LinkedHashSet<>(list1); merged.addAll(list2); // 自动跳过 list2 中已存在的元素 List result = new ArrayList<>(merged);
Stream API 合并(Java 8+)适合链式处理或需过滤/映射 如果合并只是整个数据流处理中的一环——比如还要去重、过滤空值、转大写——用
Stream.concat()
比先合再处理更简洁。但它会创建中间对象,小数据量无感,高频调用或 大数据 要注意 GC 压力。 容易踩的坑:
Stream.concat()
参数不能为
null
,哪怕其中一个集合是空
ArrayList
也没问题,但传
null
就直接
NullPointerException
;另外,
collect(Collectors.toList())
返回的是不可变视图吗?不是,是普通
ArrayList
实例,可修改。 空集合可用
Collections.emptyStream()
补位,避免判空分支 想保留顺序且去重,接
.distinct()
,但它依赖
equals/hashCode
若原始集合很大,考虑用
parallelStream()
,但注意线程安全和副作用
List result = Stream.concat(list1.stream(), list2.stream()) .distinct() .filter(Objects::nonNull) .collect(Collectors.toList());
不可变集合合并?用
ImmutableList
(Guava)或
List.of()
(Java 14+) 如果你明确不需要后续修改,且希望编译期或运行期阻止误改,就别用
new ArrayList<>()
包一层了。Java 14 引入的
List.of()
创建的是真正不可变实例,任何
add
/
remove
都抛
UnsupportedOperationException
;Guava 的
ImmutableList.builder()
更灵活,支持多次
add
后一次性构建。 注意:
List.of()
不接受
null
元素,传入会立即抛
NullPointerException
;而 Guava 的
builder
允许
null
(除非显式配置禁止)。另外,
List.of()
最多支持 10 个参数,超了得用
List.ofArray()
或换 Guava。 Java 9+ 可用
Lists.newArrayList()
(Guava)配合
ImmutableList.copyOf()
不要对
List.of()
结果再套
Collections.unmodifiableList()
——纯属多余 合并后若要传给只读接口(如某些框架配置方法),不可变集合能提前暴露 misuse
// Java 14+ List merged = List.of(list1.toArray(new String[0])); // 不行,这是单元素 // 正确方式: List merged = ImmutableList.builder() .addAll(list1) .addAll(list2) .build();
合并逻辑本身不难,难的是根据「是否允许重复」「是否需顺序」「是否可变」「是否高频调用」这几个条件组合选对方案。漏掉任一条件,上线后可能表现为数据错乱、OOM 或莫名其妙的
UnsupportedOperationException
。

相关文章