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)

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

相关推荐
qh0526wy2 分钟前
金融接口基方法Python
windows·python·金融
史迪仔01127 分钟前
Python生成器:高效处理大数据的秘密武器
前端·数据库·python
小薛博客1 小时前
4、前后端联调文生文、文生图事件
java·ai
愛~杦辷个訾2 小时前
芋道项目,商城模块数据表结构
java·sql·芋道·yudao-cloud·芋道商城
reasonsummer5 小时前
【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最大化、最小化Vs界面
开发语言·python
Doker 多克5 小时前
Python-Django系列—日志
python·日志
C_Liu_6 小时前
C语言:深入理解指针(5)
java·c语言·算法
苏三福6 小时前
ros2 hunmle bag 数据包转为图片数据 python版
开发语言·python·ros2humble
佛祖保佑永不宕机6 小时前
麒麟系统ARM64架构部署mysql、jdk和java项目
java·arm
qqxhb7 小时前
零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
java·开发语言·javafx