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)

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

相关推荐
小毛驴85025 分钟前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT1 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟2 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
程序视点3 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk9983 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社24 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理4 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码4 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
烛阴4 小时前
简单入门Python装饰器
前端·python