一、List 核心定义
List 是 Java 单列集合 Collection 的核心子接口,有序、可重复、支持索引,能精确控制元素插入位置与访问顺序,解决数组固定长度缺陷,提供灵活的元素操作能力。
二、List 核心特性
-
有序性:元素按插入顺序存储,遍历顺序与插入顺序一致;
-
可重复性:允许存储多个值相等的元素(无去重逻辑);
-
索引支持:通过整数索引(从 0 开始)直接访问、操作元素;
-
泛型支持:指定元素类型,避免类型转换错误,提升代码安全性;
-
动态扩容:无需手动指定长度,容量随元素增加自动调整。
三、常用实现类(3个核心类)
- ArrayList(最常用)
• 底层实现:动态数组(JDK8 无初始容量,首次添加元素初始化容量为 10,扩容时按 1.5 倍增长);
• 核心性能:查询、随机访问快(直接通过索引定位,时间复杂度 O(1)),增删慢(需移动数组元素,时间复杂度 O(n));
• 线程安全:非线程安全,多线程并发修改会抛 ConcurrentModificationException;
• 适用场景:查询频繁、增删操作少的场景(如数据展示、列表查询)。
- LinkedList
• 底层实现:双向链表(每个节点存储元素、前驱节点地址、后继节点地址);
• 核心性能:增删快(仅需修改节点指针,时间复杂度 O(1),首尾操作效率最优),查询慢(需遍历链表定位,时间复杂度 O(n));
• 线程安全:非线程安全;
• 额外能力:实现 Deque 接口,可作为队列(Queue)、双端队列使用,支持首尾快速操作;
• 适用场景:增删频繁、查询少的场景(如队列入队出队、链表结构业务)。
四、List 方法(含特有方法)
- 基础操作(继承自 Collection)
• 增:add(E e)(末尾加元素)、addAll(Collection<? extends E> c)(添加另一个集合所有元素);
• 删:remove(Object o)(删除首个匹配元素)、clear()(清空所有元素);
• 查:size()(返回元素个数)、contains(Object o)(判断是否含指定元素)、isEmpty()(判断是否为空);
• 遍历:、forEach
- 索引特有操作(List 专属,核心重点)
• 增:add(int index, E e)(在指定索引插入元素,后续元素后移);
• 查:get(int index)(获取指定索引元素,索引越界抛 IndexOutOfBoundsException);
• 删:remove(int index)(删除指定索引元素,后续元素前移);
• 定位:indexOf(Object o)(返回元素首次出现的索引,未找到返回 -1)、lastIndexOf(Object o)(返回元素末次出现的索引,未找到返回 -1);
• 截取:subList(int fromIndex, int toIndex)(截取 [fromIndex, toIndex) 区间的子 List,子 List 与原 List 共享底层数据,修改相互影响);
• 替换:set(int index, E e)(替换指定索引的元素,返回被替换的旧元素);
• 转数组:toArray(T[] a)(转为指定类型数组,推荐使用,避免类型转换)。
五、List 遍历方式(4种常用)
- 普通 for 循环(利用索引,仅 List 支持):
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
}
- 增强 for 循环(简洁,所有 Collection 通用):
for (E element : list) {
// 操作元素
}
六、代码
java
package testlist;
import java.util.ArrayList;
import java.util.List;
public class TestList {
public static void main(String[] args) {
//存储多个字符串:数字-》集合
//List:有序,有下标,元素可以重复
//1.创建集合元素
List strs=new ArrayList();
//往集合中添加元素
strs.add("aa");
strs.add("bb");
strs.add("cc");
strs.add("cc");
strs.set(2,"cc");
System.out.println("集合中元素的个数"+strs.size());
System.out.println("根据下标获取对应的元素"+strs.get(2));
//3.对集合元素进行遍历
for(int i=0;i<strs.size();i++){
System.out.println(strs.get(i));
}
System.out.println("-------将小写转为大写------");
for(int i=0;i<strs.size();i++){
Object s=strs.get(i);
String obj=(String)s;
System.out.println(obj.toUpperCase());
}
}
}
java
package testlist;
import java.util.ArrayList;
import java.util.List;
public class TestList2 {
public static void main(String[] args) {
//泛型集合:强制约束集合中的数据
List<String> nums=new ArrayList<String>();
nums.add("aa");
nums.add("bb");
nums.add("cc");
nums.add("aa");
System.out.println("-------下标遍历--------");
for(int i=0;i<nums.size();i++){
String s=nums.get(i);
System.out.println(s.toUpperCase());
}
System.out.println("-------forEach--遍历------");
for(String s:nums) {
System.out.println(s.toUpperCase());
}
}
}
java
package testlist;
import java.util.ArrayList;
import java.util.List;
public class TestList3 {
public static void main(String[] args) {
//存储多个整数
List<Integer> nums=new ArrayList<>();
nums.add(89);
nums.add(78);
nums.add(35);
for(Integer n:nums){
System.out.println(n);
}
double sum=0;
for(Integer a:nums){
sum+=a;
}
System.out.println("平均值:"+sum/nums.size());
}
}