news 2026/7/3 9:38:26

Java集合核心:List与Set的深度全面对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java集合核心:List与Set的深度全面对比

Java集合核心:List与Set的深度全面对比

    • 一、基础认知:Collection接口与子接口继承关系
      • 1.1 核心继承关系
      • 1.2 继承关系流程图
    • 二、核心定义:List与Set的官方标准定义
      • 2.1 List:有序可重复的动态集合
      • 2.2 Set:无序不可重复的唯一集合
    • 三、核心区别:List与Set的10大关键差异
    • 四、原理深度解析:底层实现与核心机制
      • 4.1 List底层原理
      • 4.2 Set底层原理
      • 4.3 底层结构流程图
    • 五、性能对比:增删改查效率分析
      • 5.1 查找元素
      • 5.2 插入/删除元素
      • 5.3 内存占用
    • 六、代码实战:List与Set基础用法对比
      • 6.1 List代码示例(有序+可重复+索引访问)
      • 6.2 Set代码示例(无序+不可重复+无索引)
    • 七、遍历方式:List与Set的支持差异
    • 八、使用场景:如何精准选择List/Set
      • 8.1 优先使用List的场景
      • 8.2 优先使用Set的场景
    • 九、总结:List与Set核心区别速记
    • 十、结尾

🌺The Begin🌺点点关注,收藏不迷路🌺

⬇ ⬇ 底部 ⬇ ⬇

摘要:在Java开发中,ListSetCollection接口下最常用的两大子接口,也是日常业务开发、数据处理中高频使用的集合类型。二者在底层结构、元素特性、性能表现、使用场景上存在本质区别,新手极易混淆,资深开发者也需精准掌握选型逻辑。本文将从继承关系、核心特性、底层原理、性能对比、使用场景、方法差异等维度全方位解析List和Set的区别,搭配流程图、代码示例,让你彻底吃透二者的差异!

一、基础认知:Collection接口与子接口继承关系

1.1 核心继承关系

在Java集合框架中,Collection是单列集合的根接口,ListSetQueue都直接继承自CollectionList和Set是平级关系,无继承依赖
标准继承结构
Collection(根接口)
List(有序可重复集合)
ArrayListLinkedListVector
Set(无序不可重复集合)
HashSetLinkedHashSetTreeSet

1.2 继承关系流程图

Collection接口

List接口

Set接口

Queue接口

ArrayList

LinkedList

Vector

HashSet

LinkedHashSet

TreeSet


二、核心定义:List与Set的官方标准定义

2.1 List:有序可重复的动态集合

定义:List是有序、可重复、支持索引访问的集合,完全模拟了数组的特性,同时具备动态扩容能力,元素的存储顺序=放入顺序。

2.2 Set:无序不可重复的唯一集合

定义:Set是无序、不可重复、不支持索引访问的集合,核心作用是去重,元素存储位置由哈希值/比较规则决定,而非放入顺序。


三、核心区别:List与Set的10大关键差异

序号对比维度List集合Set集合
1元素顺序有序:存储顺序=放入顺序,固定不变无序:HashSet无序,LinkedHashSet维护插入顺序,TreeSet自然排序
2元素重复支持重复:允许存入多个相同元素不支持重复:重复元素会被自动覆盖/丢弃
3底层结构ArrayList:动态数组;LinkedList:双向链表HashSet:哈希表;TreeSet:红黑树;LinkedHashSet:哈希表+链表
4索引支持支持索引:可通过下标直接访问元素不支持索引:无法通过下标获取指定元素
5查找效率极高:ArrayList通过索引O(1)查找较低:需遍历/哈希匹配,无索引快速查找
6增删效率较低:中间增删会触发元素位移,O(n)极高:增删不改变元素位置,直接操作哈希表/树
7遍历方式for循环、增强for、迭代器、Stream仅支持增强for、迭代器、Stream
8核心方法get(index)、set(index,val)、add(index,val)无索引相关方法,仅基础add/remove/contains
9元素要求无特殊要求,任意对象均可存入必须重写equals()和hashCode()(TreeSet需实现Comparable)
10典型场景有序数据存储、列表展示、根据下标操作数据数据去重、唯一值存储、无序集合操作

四、原理深度解析:底层实现与核心机制

4.1 List底层原理

  1. ArrayList:基于动态数组实现,默认容量10,满容后按1.5倍扩容;
  2. LinkedList:基于双向链表实现,无容量限制,节点存储前后指针;
  3. 核心:顺序存储+索引映射,元素位置连续,支持随机访问。

4.2 Set底层原理

  1. HashSet:基于HashMap实现,元素作为Map的key,value为固定对象,依靠hashCode()+equals()去重;
  2. LinkedHashSet:继承HashSet,基于哈希表+双向链表维护插入顺序;
  3. TreeSet:基于TreeMap(红黑树)实现,依靠比较器排序+去重;
  4. 核心:哈希/排序规则决定存储位置,强制元素唯一性。

4.3 底层结构流程图

Set底层

HashSet

哈希表 哈希去重 无序

LinkedHashSet

哈希表+链表 插入有序

TreeSet

红黑树 自然排序

List底层

ArrayList

动态数组 顺序存储 支持索引

LinkedList

双向链表 链式存储 无索引


五、性能对比:增删改查效率分析

5.1 查找元素

  • List:ArrayList通过索引直接定位,时间复杂度O(1),查找速度极快;
  • Set:无索引,需哈希匹配或遍历,时间复杂度O(1)~O(logn),效率低于List。

5.2 插入/删除元素

  • List:数组中间增删会触发元素整体位移,时间复杂度O(n),效率低;
  • Set:直接操作哈希表/红黑树,不改变其他元素位置,时间复杂度O(1)~O(logn),效率高。

5.3 内存占用

  • List:ArrayList内存连续,占用小;LinkedList节点带指针,内存占用高;
  • Set:基于Map实现,会存储冗余value,内存占用略高于List。

六、代码实战:List与Set基础用法对比

6.1 List代码示例(有序+可重复+索引访问)

importjava.util.ArrayList;importjava.util.List;publicclassListTest{publicstaticvoidmain(String[]args){List<String>list=newArrayList<>();// 有序:添加顺序=存储顺序list.add("Java");list.add("Python");list.add("Java");// 可重复// 支持索引访问System.out.println("下标0元素:"+list.get(0));// 遍历输出:Java Python Javafor(Strings:list){System.out.print(s+" ");}}}

6.2 Set代码示例(无序+不可重复+无索引)

importjava.util.HashSet;importjava.util.Set;publicclassSetTest{publicstaticvoidmain(String[]args){Set<String>set=newHashSet<>();set.add("Java");set.add("Python");set.add("Java");// 重复元素,自动去重// 无索引,无法使用get(index)// 遍历输出:Python Java(顺序不固定)for(Strings:set){System.out.print(s+" ");}}}

七、遍历方式:List与Set的支持差异

  1. List遍历
    • 普通for循环(索引遍历);
    • 增强for循环;
    • 迭代器Iterator;
    • Stream流遍历。
  2. Set遍历
    • 仅支持增强for、迭代器、Stream流;
    • 禁止使用普通for循环(无索引)。

八、使用场景:如何精准选择List/Set

8.1 优先使用List的场景

  1. 需要有序存储数据(如列表展示、历史记录);
  2. 需要根据下标快速访问元素;
  3. 允许元素重复,需要保留所有插入数据;
  4. 查找操作远多于增删操作。

8.2 优先使用Set的场景

  1. 需要自动去重,保证元素唯一性;
  2. 不关心元素存储顺序,只关注数据是否存在;
  3. 频繁插入/删除元素,追求高效性能;
  4. 实现唯一标识、权限集合、去重统计等业务。

九、总结:List与Set核心区别速记

  1. 顺序:List有序,Set默认无序;
  2. 重复:List可重复,Set不可重复;
  3. 索引:List支持索引,Set不支持索引;
  4. 性能:List查找快、增删慢;Set增删快、查找慢;
  5. 场景:List用于有序列表,Set用于唯一去重。

十、结尾

本文从继承关系、核心特性、底层原理、性能、代码、场景全方位解析了Java中List和Set的区别,二者作为Collection的核心子接口,是Java开发的基础必备知识。记住核心选型规则:要有序、可重复、索引访问选List;要去重、无序、高效增删选Set,在实际开发中根据业务需求灵活选择即可!



🌺The End🌺点点关注,收藏不迷路🌺

⬆ ⬆ 顶部 ⬆ ⬆
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 9:38:03

FFXIV TexTools终极指南:三步告别FF14模组安装的烦恼

FFXIV TexTools终极指南&#xff1a;三步告别FF14模组安装的烦恼 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI FFXIV TexTools是一款专为《最终幻想14》玩家设计的强大模组管理器&#xff0c;它彻底改变了传统模…

作者头像 李华
网站建设 2026/7/3 9:36:31

LLM驱动的播客智能生产链路:从脚本生成到语音合成的工程实践

1. 这不是“用AI念稿”&#xff0c;而是重构播客生产链路的实操指南“Create a podcast with LLMs”——这个标题乍看像一句轻巧的技术口号&#xff0c;但在我过去三年深度参与27档不同垂类播客&#xff08;从硬核科技访谈到亲子教育音频专栏&#xff09;的策划、制作与分发工作…

作者头像 李华
网站建设 2026/7/3 9:36:26

Java面试复习Day 2

今日任务时间动作0-20min打开一篇讲HashMap的文章/视频&#xff0c;只看「put流程」和「1.7 vs 1.8区别」&#xff0c;别的先不看20-40min拿张纸&#xff0c;画图&#xff1a;数组→链表→红黑树&#xff0c;标注扩容触发条件40-60min对着图&#xff0c;用自己的话讲一遍&#…

作者头像 李华
网站建设 2026/7/3 9:32:49

Zotero PDF翻译插件:提升学术研究效率的5大核心功能

Zotero PDF翻译插件&#xff1a;提升学术研究效率的5大核心功能 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mirrors/zo…

作者头像 李华
网站建设 2026/7/3 9:32:33

Node.js异步编程:Promise.all并行处理与错误处理实战

在实际 Node.js 项目中&#xff0c;处理多个异步操作是家常便饭。最常见的场景是&#xff1a;一个接口需要同时查询用户信息、订单列表和商品详情&#xff0c;如果按顺序串行执行&#xff0c;总耗时将是各个查询时间的总和&#xff0c;这在高并发或网络延迟较大的情况下会成为性…

作者头像 李华