news 2026/5/11 7:32:08

吃透 Java 集合框架:单列集合与双列集合的核心原理与实战应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
吃透 Java 集合框架:单列集合与双列集合的核心原理与实战应用

文章目录

  • 前言
  • 一、集合框架概述:为什么需要集合?
  • 二、单列集合:元素的线性容器
    • 2.1 List 集合:有序可重复的容器
    • 2.2 Set 集合:无序不可重复的容器
  • 三、双列集合:键值对的映射容器
    • 3.1 Map 集合的核心特性
  • 四、单列集合与双列集合的关联与转换
    • 4.1 Map 集合转单列集合
    • 4.2 单列集合模拟双列集合
  • 总结

前言

大家好,我是程序员梁白开。

在 Java 开发中,集合框架是我们日常接触最频繁的工具之一,它就像一个功能强大的 “工具箱”,帮我们高效管理和操作数据。而在这个工具箱中,单列集合和双列集合是两大核心分类,它们各自有着明确的适用场景和设计思想。本文将从底层原理、核心实现类、使用场景等多个维度,带你全面吃透这两类集合,帮你在实际开发中精准选型、高效编码。


一、集合框架概述:为什么需要集合?

在 Java 中,数组虽然可以存储多个元素,但它存在长度固定、只能存储同一类型元素、插入删除效率低等局限性。而集合框架的出现,正是为了解决这些问题,它提供了一系列灵活、高效的数据结构,支持动态扩容、多种数据存储方式和丰富的操作方法。

Java 集合框架主要分为两大体系:

  • 单列集合:一次存储一个元素,顶层接口为Collection,我们常用的List、Set都属于这一体系。
  • 双列集合:一次存储一对元素(键值对 Key-Value),顶层接口为Map,通过键来唯一标识一个值,常用的HashMap、TreeMap等都属于此类。

二、单列集合:元素的线性容器

单列集合的核心特点是每个位置只存放一个元素,它就像一个有序的货架,每个格子里放一件商品。根据元素是否有序、是否可重复,单列集合又分为List和Set两大分支。

2.1 List 集合:有序可重复的容器

List集合的核心特性是元素有序(插入顺序和存储顺序一致)且元素可重复,它允许通过索引来访问元素,就像数组一样灵活。

实战案例:ArrayList vs LinkedList 性能对比

publicclassListPerformanceTest{publicstaticvoidmain(String[]args){List<Integer>arrayList=newArrayList<>();List<Integer>linkedList=newLinkedList<>();// 测试尾部插入longstartTime=System.currentTimeMillis();for(inti=0;i<100000;i++){arrayList.add(i);}System.out.println("ArrayList尾部插入耗时:"+(System.currentTimeMillis()-startTime)+"ms");startTime=System.currentTimeMillis();for(inti=0;i<100000;i++){linkedList.add(i);}System.out.println("LinkedList尾部插入耗时:"+(System.currentTimeMillis()-startTime)+"ms");// 测试中间插入startTime=System.currentTimeMillis();for(inti=0;i<1000;i++){arrayList.add(5000,i);}System.out.println("ArrayList中间插入耗时:"+(System.currentTimeMillis()-startTime)+"ms");startTime=System.currentTimeMillis();for(inti=0;i<1000;i++){linkedList.add(5000,i);}System.out.println("LinkedList中间插入耗时:"+(System.currentTimeMillis()-startTime)+"ms");}}

运行结果分析:ArrayList 在尾部插入时效率和 LinkedList 相当,但在中间插入时,由于需要移动大量元素,效率远低于 LinkedList。这也印证了两者的适用场景差异。

2.2 Set 集合:无序不可重复的容器

Set集合的核心特性是元素无序(插入顺序和存储顺序不一定一致)且元素不可重复,它通过元素的equals()和hashCode()方法来保证唯一性,就像一个不允许重复的标签库。

关键知识点:HashSet 去重原理

HashSet 的去重机制依赖于两个方法:

  1. 先调用元素的hashCode()方法计算哈希值,确定元素在哈希表中的位置。
  2. 如果该位置已有元素,则调用equals()方法比较两个元素是否相等。
  3. 若equals()返回 true,则视为重复元素,不添加;否则以链表或红黑树的形式存储在该位置。

注意:如果我们自定义类作为 HashSet 的元素,必须重写hashCode()和equals()方法,否则无法保证去重效果。

三、双列集合:键值对的映射容器

双列集合的核心特点是以键值对(Key-Value)的形式存储元素,它就像一本字典,通过唯一的键(Key)可以快速找到对应的值(Value)。双列集合的顶层接口是Map,它不继承Collection接口,是一个独立的体系。

3.1 Map 集合的核心特性

  • 键(Key)是唯一的,值(Value)可以重复。
  • 一个键只能对应一个值,当存入相同键的键值对时,新值会覆盖旧值。
  • 键和值都可以是任意引用类型数据(建议使用不可变类型作为 Key,如 String、Integer 等)。

TreeMap 支持自然排序(实现 Comparable 接口)和自定义排序(通过 Comparator 接口),以下是自定义排序的示例:

publicclassTreeMapCustomSort{publicstaticvoidmain(String[]args){// 自定义排序:按字符串长度排序,长度相同则按字典序排序Map<String,Integer>treeMap=newTreeMap<>(newComparator<String>(){@Overridepublicintcompare(Stringo1,Stringo2){intlen1=o1.length();intlen2=o2.length();if(len1!=len2){returnlen1-len2;// 升序排列}else{returno1.compareTo(o2);// 字典序升序}}});treeMap.put("apple",1);treeMap.put("banana",2);treeMap.put("pear",3);treeMap.put("orange",4);// 遍历输出for(Map.Entry<String,Integer>entry:treeMap.entrySet()){System.out.println(entry.getKey()+": "+entry.getValue());}}}

四、单列集合与双列集合的关联与转换

虽然单列集合和双列集合是两大独立体系,但它们之间可以通过一些方法进行转换,在实际开发中非常实用。

4.1 Map 集合转单列集合

  • keySet():将 Map 的所有键转换为 Set 集合。
  • values():将 Map 的所有值转换为 Collection 集合。
  • entrySet():将 Map 的所有键值对转换为 Set 集合(每个元素是 Map.Entry 对象)。

示例代码:

Map<String,Integer>map=newHashMap<>();map.put("Java",1);map.put("Python",2);map.put("C++",3);// 键转SetSet<String>keySet=map.keySet();// 值转CollectionCollection<Integer>values=map.values();// 键值对转SetSet<Map.Entry<String,Integer>>entrySet=map.entrySet();

4.2 单列集合模拟双列集合

我们可以使用List存储自定义的键值对对象,来模拟 Map 的功能,这种方式在一些特殊场景下(如需要重复键)非常有用。

示例代码:

// 自定义键值对类classKeyValue<K,V>{privateKkey;privateVvalue;// 构造方法、getter、setter省略}// 使用List模拟MapList<KeyValue<String,Integer>>listMap=newArrayList<>();listMap.add(newKeyValue<>("Java",1));listMap.add(newKeyValue<>("Python",2));listMap.add(newKeyValue<>("Java",3));// 允许重复键

总结

Java 集合框架是 Java 开发的基础,单列集合和双列集合作为其中的核心,掌握它们的原理和用法是每个 Java 开发者的必备技能。

  • 单列集合:适合存储单个元素,List注重有序可重复,Set注重无序不可重复。
  • 双列集合:适合存储键值对映射关系,HashMap注重高效查找,TreeMap注重排序功能。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 17:24:54

SD-XL Refiner 1.0:如何用5个步骤将普通AI图像升级为专业作品?

还在为AI生成的图像缺乏细节和质感而烦恼吗&#xff1f;SD-XL Refiner 1.0正是解决这一痛点的利器&#xff01;这款强大的图像优化模型能够将基础的AI生成图像转化为专业级别的视觉作品&#xff0c;让你的创意真正落地。在前100字内我们已经提到了SD-XL Refiner 1.0的核心价值—…

作者头像 李华
网站建设 2026/5/6 17:12:00

如何快速掌握Ren‘Py档案工具rpatool:完整使用指南

如何快速掌握RenPy档案工具rpatool&#xff1a;完整使用指南 【免费下载链接】rpatool A tool to work with RenPy archives. 项目地址: https://gitcode.com/gh_mirrors/rp/rpatool 你是否曾经遇到过需要查看或修改RenPy游戏资源档案却无从下手的困境&#xff1f;rpato…

作者头像 李华
网站建设 2026/5/11 7:25:44

Realtek 8852AE Wi-Fi 6驱动终极性能优化与深度配置指南

Realtek 8852AE Wi-Fi 6驱动终极性能优化与深度配置指南 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 在Linux系统上实现Realtek 8852AE Wi-Fi 6网卡的极致性能&#xff0c;需要突破传统驱…

作者头像 李华
网站建设 2026/5/2 14:31:03

90亿参数的推理王者!GLM-Z1-9B开源小模型强在哪?

90亿参数的推理王者&#xff01;GLM-Z1-9B开源小模型强在哪&#xff1f; 【免费下载链接】GLM-Z1-9B-0414 项目地址: https://ai.gitcode.com/zai-org/GLM-Z1-9B-0414 导语&#xff1a;GLM系列再添新丁&#xff0c;90亿参数的GLM-Z1-9B-0414开源小模型凭借出色的数学推…

作者头像 李华
网站建设 2026/5/5 3:15:30

重新定义音乐体验:MoeKoe Music如何成为二次元音乐爱好者的首选

重新定义音乐体验&#xff1a;MoeKoe Music如何成为二次元音乐爱好者的首选 【免费下载链接】MoeKoeMusic 一款开源简洁高颜值的酷狗第三方客户端 An open-source, concise, and aesthetically pleasing third-party client for KuGou that supports Windows / macOS / Linux :…

作者头像 李华
网站建设 2026/5/4 21:15:43

谷歌镜像访问学术论文支撑IndexTTS2研究背景

谷歌镜像访问学术论文支撑IndexTTS2研究背景 在当前AIGC浪潮席卷内容生成领域的背景下&#xff0c;语音合成技术正从“能说”向“会表达”跃迁。以IndexTTS2为代表的开源TTS系统&#xff0c;不再满足于基础的文本朗读功能&#xff0c;而是致力于让机器语音具备情感温度与语境感…

作者头像 李华