Java 集合之 List 与 Set 学习笔记​

一、集合框架基础认知​

Java 集合是用于存储、操作多个对象的容器,位于java.util包下,主要分为Collection和Map两大体系。其中List和Set是Collection接口的核心子接口,与数组相比,集合具备动态扩容、便捷操作(增删改查)等优势,是 Java 开发中处理批量数据的核心工具。​

二、List 接口:有序可重复的集合​

(一)核心特性​

List 接口的核心特点是元素有序(插入顺序与存储顺序一致)、可重复、支持索引访问,就像有序排列的 “队伍”,每个元素都有明确的位置编号(从 0 开始),可以通过索引直接操作元素。​

(二)常用实现类​

  1. ArrayList(数组实现)​
  • 底层基于动态数组,查询效率高(通过索引直接访问,时间复杂度 O (1)),增删效率低(需移动数组元素,时间复杂度 O (n))。​
  • 初始容量为 10,扩容机制为默认扩容至原容量的 1.5 倍,适合查询频繁、增删少的场景(如学生成绩列表查询)。​
  • 线程不安全,多线程环境下需使用Collections.synchronizedList(list)或CopyOnWriteArrayList。​
  1. LinkedList(双向链表实现)​
  • 底层基于双向链表,增删效率高(仅需修改节点引用,时间复杂度 O (1)),查询效率低(需遍历链表,时间复杂度 O (n))。​
  • 实现了Deque接口,支持队列、栈的操作(如addFirst()、removeLast()),适合增删频繁、查询少的场景(如消息队列)。​
  1. 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 () 判断),就像无序的 “集合”,不允许存在相同元素。​

(二)常用实现类​

  1. HashSet(哈希表实现)​
  • 底层基于哈希表(数组 + 链表 / 红黑树),查询、增删效率高(时间复杂度 O (1))。​
  • 无序性:元素存储位置由哈希值决定,与插入顺序无关;不可重复性:通过hashCode()和equals()保证,若两个元素哈希值不同则直接存储,哈希值相同则通过 equals () 判断是否重复。​
  • 允许存储 null 元素(仅一个),线程不安全,适合去重、高效查询场景(如用户 ID 去重)。​
  1. TreeSet(红黑树实现)​
  • 底层基于红黑树(有序二叉树),元素会按自然顺序(如 Integer 升序、String 字典序)或自定义比较器排序。​
  • 不可重复,查询、增删效率为 O (log n),不允许 null 元素,适合需要排序的去重场景(如成绩排序去重)。​
  • 自定义排序:需让元素实现Comparable接口,或创建 TreeSet 时传入Comparator比较器。​
  1. 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​

适用场景​

需保留顺序、频繁查询​

需去重、无需顺序(或需排序)​

五、学习总结与注意事项​

  1. 集合与数组的区别:数组长度固定,集合动态扩容;数组可存基本类型和对象,集合仅存对象(基本类型自动装箱)。​
  1. 去重关键:Set 的不可重复性依赖hashCode()和equals(),自定义类存入 Set 时需重写这两个方法,保证逻辑一致(哈希值相同则 equals () 返回 true)。​
  1. 线程安全:ArrayList、HashSet 等均为线程不安全,多线程环境需使用并发集合(如CopyOnWriteArraySet)或手动加锁。​
  1. 性能选择:查询多选 ArrayList,增删多选 LinkedList;去重高效选 HashSet,排序去重选 TreeSet。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐