Java 集合之 List 与 Set 学习笔记
·
Java 集合之 List 与 Set 学习笔记
一、集合框架基础认知
Java 集合是用于存储、操作多个对象的容器,位于java.util包下,主要分为Collection和Map两大体系。其中List和Set是Collection接口的核心子接口,与数组相比,集合具备动态扩容、便捷操作(增删改查)等优势,是 Java 开发中处理批量数据的核心工具。
二、List 接口:有序可重复的集合
(一)核心特性
List 接口的核心特点是元素有序(插入顺序与存储顺序一致)、可重复、支持索引访问,就像有序排列的 “队伍”,每个元素都有明确的位置编号(从 0 开始),可以通过索引直接操作元素。
(二)常用实现类
- ArrayList(数组实现)
- 底层基于动态数组,查询效率高(通过索引直接访问,时间复杂度 O (1)),增删效率低(需移动数组元素,时间复杂度 O (n))。
- 初始容量为 10,扩容机制为默认扩容至原容量的 1.5 倍,适合查询频繁、增删少的场景(如学生成绩列表查询)。
- 线程不安全,多线程环境下需使用Collections.synchronizedList(list)或CopyOnWriteArrayList。
- LinkedList(双向链表实现)
- 底层基于双向链表,增删效率高(仅需修改节点引用,时间复杂度 O (1)),查询效率低(需遍历链表,时间复杂度 O (n))。
- 实现了Deque接口,支持队列、栈的操作(如addFirst()、removeLast()),适合增删频繁、查询少的场景(如消息队列)。
- Vector(线程安全的数组实现)
- 与 ArrayList 类似,但支持线程同步(方法加synchronized),效率较低,现代开发中已较少使用,多被 ArrayList 替代。
(三)核心方法
- 增:add(E e)(尾部添加)、add(int index, E e)(指定索引插入)、addAll(Collection c)(添加集合)。
- 删:remove(int index)(按索引删)、remove(Object o)(按元素删)、clear()(清空)。
- 查:get(int index)(按索引查)、indexOf(Object o)(获取元素首次索引)、size()(获取长度)。
- 改:set(int index, E e)(替换指定索引元素)。
- 遍历:for 循环(索引遍历)、增强 for 循环、迭代器(Iterator)。
三、Set 接口:无序不可重复的集合
(一)核心特性
Set 接口的核心特点是元素无序(存储顺序与插入顺序无关)、不可重复(基于 equals () 和 hashCode () 判断),就像无序的 “集合”,不允许存在相同元素。
(二)常用实现类
- HashSet(哈希表实现)
- 底层基于哈希表(数组 + 链表 / 红黑树),查询、增删效率高(时间复杂度 O (1))。
- 无序性:元素存储位置由哈希值决定,与插入顺序无关;不可重复性:通过hashCode()和equals()保证,若两个元素哈希值不同则直接存储,哈希值相同则通过 equals () 判断是否重复。
- 允许存储 null 元素(仅一个),线程不安全,适合去重、高效查询场景(如用户 ID 去重)。
- TreeSet(红黑树实现)
- 底层基于红黑树(有序二叉树),元素会按自然顺序(如 Integer 升序、String 字典序)或自定义比较器排序。
- 不可重复,查询、增删效率为 O (log n),不允许 null 元素,适合需要排序的去重场景(如成绩排序去重)。
- 自定义排序:需让元素实现Comparable接口,或创建 TreeSet 时传入Comparator比较器。
- LinkedHashSet(哈希表 + 链表实现)
- 继承自 HashSet,底层在哈希表基础上增加了双向链表,保证元素的插入顺序,兼具 HashSet 的高效性和有序性(插入顺序)。
- 不可重复,允许 null 元素,线程不安全,适合需要去重且保留插入顺序的场景。
(三)核心方法
- 增:add(E e)(添加元素,重复元素不生效)、addAll(Collection c)。
- 删:remove(Object o)、clear()。
- 查:contains(Object o)(判断是否包含元素)、size()。
- 遍历:增强 for 循环、迭代器(无索引,不支持普通 for 循环)。
四、List 与 Set 核心区别
|
特性 |
List |
Set |
|
有序性 |
有序(插入顺序) |
无序(LinkedHashSet 除外) |
|
重复性 |
可重复 |
不可重复 |
|
索引访问 |
支持(通过索引操作) |
不支持 |
|
核心实现类 |
ArrayList、LinkedList |
HashSet、TreeSet |
|
适用场景 |
需保留顺序、频繁查询 |
需去重、无需顺序(或需排序) |
五、学习总结与注意事项
- 集合与数组的区别:数组长度固定,集合动态扩容;数组可存基本类型和对象,集合仅存对象(基本类型自动装箱)。
- 去重关键:Set 的不可重复性依赖hashCode()和equals(),自定义类存入 Set 时需重写这两个方法,保证逻辑一致(哈希值相同则 equals () 返回 true)。
- 线程安全:ArrayList、HashSet 等均为线程不安全,多线程环境需使用并发集合(如CopyOnWriteArraySet)或手动加锁。
- 性能选择:查询多选 ArrayList,增删多选 LinkedList;去重高效选 HashSet,排序去重选 TreeSet。
更多推荐


所有评论(0)