List的核心特点是有序、可重复、支持索引访问;它严格保持插入顺序,允许重复元素,提供基于下标的快速读写操作,并明确定义首、尾及任意位置的操作能力。

List 是 Java 集合框架中最常用、最基础的接口之一,它的核心特点就是有序、可重复、支持索引访问。它不关心元素是否唯一,也不强制排序,而是忠实记录你添加的顺序,并允许通过下标(0 开始)快速定位元素。
有序性:插入顺序即遍历顺序
List 保证元素的存储顺序与插入顺序严格一致。无论你 add(0, x) 插入开头,还是 add(x) 追加末尾,后续调用 for-each 或 get(i) 都会按这个顺序呈现。
- ArrayList 内部用数组实现,天然有序
- LinkedList 用双向链表串联节点,也严格维护插入次序
- 即使多次增删,只要没手动调用 Collections.sort(),顺序始终由插入/移动操作决定
允许重复元素:不排斥相同值
List 不做去重校验。你可以连续 add("a") 三次,列表里就存了三个 "a",get(0)、get(1)、get(2) 全部返回 "a"。
- 这和 Set 接口形成鲜明对比(Set 要求元素唯一)
- 适合场景如:操作日志记录、用户点击流、批量导入的原始数据缓存
- 若需去重,得额外用 new ArrayList(new LinkedHashSet(list)) 等方式转换
支持随机访问:通过索引快速读写
List 提供 get(int index)、set(int index, E element)、add(int index, E element) 等基于位置的操作,这是它区别于 Queue 或 Stack 的关键能力。
立即学习“Java免费学习笔记(深入)”;
- ArrayList 的 get() 是 O(1),因为直接查数组
- LinkedList 的 get() 是 O(n),需从头或尾遍历靠近目标的节点
- 注意:remove(Object) 是按值查找删除(O(n)),而 remove(int) 是按索引删除(ArrayList 为 O(n) 因要搬移后续元素)
有明确的“位置”概念:首尾+中间都可操作
List 明确定义了 0 号位(首个)、size()-1 号位(末个),并支持在任意合法下标处插入或删除。
- add(0, x) 实现“头插”,add(size(), x) 等价于 add(x) 尾插
- list.subList(from, to) 返回原列表的逻辑视图,修改它会同步影响原 list
- isEmpty()、get(0)、get(size()-1) 常用于判断和获取首尾元素
基本上就这些。理解 List 的“有序、可重复、可索引”三个锚点,就能准确选型(比如该用 ArrayList 还是 LinkedList)、避开常见误用(如把 List 当 Set 用),也能读懂源码中那些 indexOutOfBounds 或 modCount 检查的意图。










