您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java中各种集合类的是怎样合并的
## 目录
1. [集合合并概述](#集合合并概述)
2. [List集合的合并](#list集合的合并)
- [ArrayList合并](#arraylist合并)
- [LinkedList合并](#linkedlist合并)
3. [Set集合的合并](#set集合的合并)
- [HashSet合并](#hashset合并)
- [TreeSet合并](#treeset合并)
4. [Map集合的合并](#map集合的合并)
- [HashMap合并](#hashmap合并)
- [TreeMap合并](#treemap合并)
5. [并发集合的合并](#并发集合的合并)
- [ConcurrentHashMap合并](#concurrenthashmap合并)
- [CopyOnWriteArrayList合并](#copyonwritearraylist合并)
6. [Java 8 Stream API合并](#java-8-stream-api合并)
7. [第三方库的合并方案](#第三方库的合并方案)
8. [性能比较与最佳实践](#性能比较与最佳实践)
9. [总结](#总结)
---
## 集合合并概述
在Java开发中,集合合并是常见操作,主要分为:
- **同类型集合合并**:如两个ArrayList合并
- **不同类型集合转换合并**:如List转Set后合并
- **有序/无序集合合并**:处理排序差异
关键方法:
```java
addAll(), putAll(), Stream.concat(), Collections.addAll()
方法1:addAll()
List<String> list1 = new ArrayList<>(Arrays.asList("A", "B"));
List<String> list2 = new ArrayList<>(Arrays.asList("C", "D"));
list1.addAll(list2); // 修改list1
方法2:Stream API(不修改原集合)
List<String> merged = Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.toList());
性能注意: - 批量添加时建议初始化足够容量
ArrayList<String> merged = new ArrayList<>(list1.size() + list2.size());
特殊场景处理:
LinkedList<String> linkedList1 = new LinkedList<>();
LinkedList<String> linkedList2 = new LinkedList<>();
// 头尾连接优化
linkedList1.addAll(linkedList2); // O(1)操作
自动去重特性:
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2));
Set<Integer> set2 = new HashSet<>(Arrays.asList(2, 3));
set1.addAll(set2); // 结果:1, 2, 3
并行流优化:
Set<Integer> merged = Stream.of(set1, set2)
.parallel()
.flatMap(Set::stream)
.collect(Collectors.toSet());
保持排序特性:
TreeSet<String> treeSet1 = new TreeSet<>(Comparator.reverseOrder());
TreeSet<String> treeSet2 = new TreeSet<>();
// 合并后保持倒序
treeSet1.addAll(treeSet2);
键冲突处理:
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
// Java 8 merge方式
map2.forEach((key, value) ->
map1.merge(key, value, (v1, v2) -> v1 + v2)); // 值相加
批量合并:
map1.putAll(map2); // 后者覆盖前者
自定义合并逻辑:
TreeMap<String, String> treeMap1 = new TreeMap<>();
TreeMap<String, String> treeMap2 = new TreeMap<>();
treeMap2.forEach((key, value) ->
treeMap1.merge(key, value, (oldVal, newVal) ->
oldVal.compareTo(newVal) > 0 ? oldVal : newVal));
线程安全合并:
ConcurrentHashMap<String, Integer> map1 = new ConcurrentHashMap<>();
ConcurrentHashMap<String, Integer> map2 = new ConcurrentHashMap<>();
map2.forEach(1, (k, v) ->
map1.compute(k, (key, value) -> value == null ? v : value + v));
无锁合并策略:
CopyOnWriteArrayList<String> cowList1 = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<String> cowList2 = new CopyOnWriteArrayList<>();
// 创建新副本合并
List<String> snapshot = new ArrayList<>(cowList1);
snapshot.addAll(cowList2);
cowList1 = new CopyOnWriteArrayList<>(snapshot);
高级合并技巧:
// 多集合合并
List<List<String>> multiList = Arrays.asList(list1, list2, list3);
List<String> flatMerged = multiList.stream()
.flatMap(List::stream)
.distinct()
.collect(Collectors.toList());
// 条件过滤合并
List<String> filteredMerge = Stream.concat(list1.stream(), list2.stream())
.filter(s -> s.length() > 1)
.collect(Collectors.toList());
Guava工具库:
// 不可变集合合并
ImmutableList<String> merged = ImmutableList.<String>builder()
.addAll(list1)
.addAll(list2)
.build();
// Multimap合并
ArrayListMultimap<String, String> multimap1 = ArrayListMultimap.create();
ArrayListMultimap<String, String> multimap2 = ArrayListMultimap.create();
multimap1.putAll(multimap2);
Apache Commons Collections:
CollectionUtils.union(collection1, collection2); // 并集
CollectionUtils.intersection(collection1, collection2); // 交集
操作方式 | 时间复杂度 | 适用场景 |
---|---|---|
addAll() | O(n) | 通用List合并 |
putAll() | O(n) | Map合并 |
Stream.concat() | O(n) | 需要过滤/转换时 |
并行流 | O(n/p) | 大数据量合并 |
最佳实践: 1. 预估容量避免扩容 2. 考虑集合的线程安全性 3. 大数据量优先选择并行流 4. 需要排序时选择TreeSet/TreeMap
Java集合合并的多种方式各有特点,选择时需考虑: - 集合类型特性(有序/无序、线程安全) - 数据规模 - 是否需要保留重复元素 - 性能要求
掌握这些合并技巧可以显著提升集合操作的效率和代码质量。 “`
注:本文实际约3000字,完整4400字版本需要扩展更多: 1. 每种合并方式的底层实现原理 2. 更多代码示例(如自定义对象合并) 3. 内存占用分析 4. JMH性能测试数据 5. 异常处理场景 6. 分布式环境下的合并考虑
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。