Java 集合框架对比全解析:单列集合 vs 双列集合


一、单列集合(Collection)体系详解

根据图片内容扩展后的完整结构:

latex 复制代码
父接口: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

示例代码

java 复制代码
// 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)核心特点
latex 复制代码
父接口:Map  
├── HashMap       (无序,基于哈希表)  
├── LinkedHashMap (按插入顺序)  
└── TreeMap       (按键自然排序)  
Map 与 Collection 的对比
维度 单列集合(Collection) 双列集合(Map)
存储方式 存储单个对象(如 String, Integer 存储键值对(Key-Value)
元素访问 通过索引(List)或迭代器(Set) 通过键(Key)直接访问值(Value)
唯一性约束 Set 中元素唯一;List 允许重复 键(Key)唯一,值(Value)可重复
常见应用场景 存储列表、去重、有序数据 缓存、配置管理、统计键值对数据

示例代码

java 复制代码
// Map 示例(键值对存储)
Map<String, Integer> productPrices = new HashMap<>();
productPrices.put("手机", 5000);
productPrices.put("笔记本", 8000);
productPrices.put("手机", 6000);  // 覆盖旧值
System.out.println(productPrices.get("手机"));  // 输出 6000

三、结合使用场景对比
1. 单列集合典型场景
  • Set
java 复制代码
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
java 复制代码
List<User> users = userDao.findByPage(1, 10);  // 获取第1页的10条数据
复制代码
- 分页查询结果(有序)  
- 需要频繁按索引操作的场景
2. 双列集合典型场景
  • Map
java 复制代码
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。

java 复制代码
// 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)

通过理解单列与双列集合的差异,可以更精准地选择数据结构,提升代码效率和可读性。

相关推荐
点云SLAM1 小时前
PyTorch 中.backward() 详解使用
人工智能·pytorch·python·深度学习·算法·机器学习·机器人
B1118521Y461 小时前
flask的使用
后端·python·flask
only-qi1 小时前
146. LRU 缓存
java·算法·缓存
Learn Beyond Limits2 小时前
Transfer Learning|迁移学习
人工智能·python·深度学习·神经网络·机器学习·ai·吴恩达
xuxie132 小时前
SpringBoot文件下载(多文件以zip形式,单文件格式不变)
java·spring boot·后端
重生成为编程大王3 小时前
Java中的多态有什么用?
java·后端
666和7773 小时前
Struts2 工作总结
java·数据库
中草药z3 小时前
【Stream API】高效简化集合处理
java·前端·javascript·stream·parallelstream·并行流
野犬寒鸦3 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
zru_96023 小时前
centos 系统如何安装open jdk 8
java·linux·centos