Java 集合框架对比全解析:单列集合 vs 双列集合
一、单列集合(Collection)体系详解
根据图片内容扩展后的完整结构:
父接口:Collection
├── **子接口:Set**(无序、无索引、元素唯一)
│ ├── HashSet (基于哈希表,快速访问)
│ └── TreeSet (基于红黑树,自然排序)
│
└── **子接口:List**(有序、有索引、元素可重复) ├── ArrayList (动态数组,随机访问快) └── LinkedList (双向链表,增删效率高)
1. Set 与 List 的对比
特性 | Set | List |
---|---|---|
元素顺序 | 无序 | 有序(按插入顺序或索引) |
索引访问 | 不支持 get(index) | 支持 get(0) , set(1, value) |
元素唯一性 | 唯一(依赖 equals() 和 hashCode() ) | 可重复 |
典型实现类 | HashSet , TreeSet | ArrayList , LinkedList |
示例代码:
// Set 示例(去重)
Set<String> cities = new HashSet<>();
cities.add("北京");
cities.add("上海");
cities.add("北京"); // 重复元素被忽略
System.out.println(cities); // 输出 [北京, 上海]// List 示例(保留顺序和重复)
List<String> list = new ArrayList<>();
list.add("苹果");
list.add("香蕉");
list.add("苹果"); // 允许重复
System.out.println(list.get(0)); // 输出 "苹果"
二、双列集合(Map)核心特点
父接口:Map
├── HashMap (无序,基于哈希表)
├── LinkedHashMap (按插入顺序)
└── TreeMap (按键自然排序)
Map 与 Collection 的对比
维度 | 单列集合(Collection) | 双列集合(Map) |
---|---|---|
存储方式 | 存储单个对象(如 String , Integer ) | 存储键值对(Key-Value) |
元素访问 | 通过索引(List)或迭代器(Set) | 通过键(Key)直接访问值(Value) |
唯一性约束 | Set 中元素唯一;List 允许重复 | 键(Key)唯一,值(Value)可重复 |
常见应用场景 | 存储列表、去重、有序数据 | 缓存、配置管理、统计键值对数据 |
示例代码:
// Map 示例(键值对存储)
Map<String, Integer> productPrices = new HashMap<>();
productPrices.put("手机", 5000);
productPrices.put("笔记本", 8000);
productPrices.put("手机", 6000); // 覆盖旧值
System.out.println(productPrices.get("手机")); // 输出 6000
三、结合使用场景对比
1. 单列集合典型场景
- Set:
Set<String> set1 = new HashSet<>(Arrays.asList("A", "B", "C"));
Set<String> set2 = new HashSet<>(Arrays.asList("B", "C", "D"));
set1.retainAll(set2); // 交集:结果为 ["B", "C"]
- 去重(如统计不重复的 IP 地址)
- 集合运算(并集、交集)
- List:
List<User> users = userDao.findByPage(1, 10); // 获取第1页的10条数据
- 分页查询结果(有序)
- 需要频繁按索引操作的场景
2. 双列集合典型场景
- Map:
Map<String, Integer> wordCount = new HashMap<>();
for (String word : words) { wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
- 缓存用户信息(Key=用户ID,Value=用户对象)
- 统计词频(Key=单词,Value=出现次数)
四、联动使用:单列集合 + Map
场景:从数据库查询订单列表(List),转换为按订单ID快速查找的 Map。
// 1. 查询订单列表(单列集合)
List<Order> orders = orderDao.findAll();// 2. 转换为 Map(双列集合)
Map<Long, Order> orderMap = new HashMap<>();
for (Order order : orders) {orderMap.put(order.getId(), order); // Key=订单ID,Value=订单对象
}// 3. 快速查找订单
Order order1001 = orderMap.get(1001L);
五、总结对比图
特性 | Set | List | Map |
---|---|---|---|
核心用途 | 去重 | 有序列表 | 键值对映射 |
元素唯一性 | 唯一 | 可重复 | 键唯一,值可重复 |
顺序性 | 无序 | 有序 | 无序或有序(取决于实现类) |
访问方式 | 迭代器 | 索引 | 键(Key) |
通过理解单列与双列集合的差异,可以更精准地选择数据结构,提升代码效率和可读性。