List
是 Java 集合框架(Collection Framework)中的一个有序队列接口,直接继承自 Collection
接口。ArrayList
、LinkedList
)支持动态调整容量。接口 | 有序性 | 重复性 | 数据结构 | 典型实现类 |
---|---|---|---|---|
List |
是 | 是 | 线性表 | ArrayList 、LinkedList |
Set |
否 | 否 | 集合(哈希表等) | HashSet 、TreeSet |
Queue |
是 | 是 | 队列(FIFO) | LinkedList 、PriorityQueue |
boolean add(E e)
:向列表末尾添加元素,成功返回 true
。List list = new ArrayList<>();
list.add("Apple"); // 添加到末尾
void add(int index, E element)
:在指定索引处插入元素,后续元素后移。
list.add(1, "Banana"); // 在索引1处插入元素
E remove(int index)
:移除指定索引处的元素,返回被删除元素。String removed = list.remove(0); // 移除索引0的元素
boolean remove(Object o)
:移除列表中第一个匹配的元素(通过 equals
方法判断)。
list.remove("Apple"); // 移除值为"Apple"的元素
E set(int index, E element)
:用指定元素替换指定索引处的元素,返回旧元素。String oldValue = list.set(0, "Grape"); // 将索引0的元素改为"Grape"
E get(int index)
:返回指定索引处的元素。String first = list.get(0); // 获取索引0的元素
int indexOf(Object o)
:返回元素首次出现的索引,不存在则返回 -1
。
int pos = list.indexOf("Banana"); // 查询"Banana"的位置
int lastIndexOf(Object o)
:返回元素最后一次出现的索引,不存在则返回 -1
。boolean contains(Object o)
:判断列表是否包含指定元素(基于 equals
)。boolean.addAll(Collection extends E> c)
:将其他集合的所有元素添加到列表末尾。void clear()
:移除列表中的所有元素。boolean isEmpty()
:判断列表是否为空。int size()
:返回列表中的元素个数。Iterator it = list.iterator();
while (it.hasNext()) {
String element = it.next();
// 处理元素
}
列表迭代器(ListIterator):支持双向遍历和元素修改:
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String element = lit.next();
lit.set(element + "_modified"); // 修改元素
}
List.subList(int fromIndex, int toIndex)
):List sub = list.subList(0, 2); // 包含索引0,不包含索引2
Object[]
)。get(int)
)速度快(时间复杂度 O (1))。10
(JDK 1.8)。Arrays.copyOf
复制数组)。prev
、next
指针)。LinkedList queue = new LinkedList<>();
queue.offer("A"); // 入队(添加到末尾)
String first = queue.poll(); // 出队(移除并返回头部元素)
可作为栈(Stack)使用:
queue.push("B"); // 入栈(添加到头部)
String last = queue.pop(); // 出栈(移除并返回头部元素)
ArrayList
类似。synchronized
修饰(如 add()
、get()
),但性能较低。Collections.synchronizedList()
替代)。实现类 | 底层结构 | 线程安全 | 随机访问效率 | 增删效率(中间位置) | 默认初始容量 |
---|---|---|---|---|---|
ArrayList | 动态数组 | 否 | 高(O (1)) | 低(O (n)) | 10 |
LinkedList | 双向链表 | 否 | 低(O (n)) | 高(O (1)) | - |
Vector | 动态数组 | 是 | 高(O (1)) | 低(O (n)) | 10 |
for (int i = 0; i < list.size(); i++) {
String element = list.get(i);
}
适用场景:需要通过索引操作元素(如修改、删除)。
for (String element : list) {
// 只读操作元素
}
注意:遍历时若修改列表(如 list.remove()
),会抛出 ConcurrentModificationException
(fail-fast 机制)。
Iterator it = list.iterator();
while (it.hasNext()) {
String element = it.next();
if (element.equals("Apple")) {
it.remove(); // 安全删除元素的方式
}
}
优势:支持遍历过程中安全删除元素(通过 Iterator.remove()
)。
list.stream().forEach(element -> {
System.out.println(element);
});
适用场景:结合 Lambda 表达式实现复杂逻辑(如过滤、映射)。
Collections.sort()
)List nums = Arrays.asList(3, 1, 4, 2);
Collections.sort(nums); // 升序排列(默认自然排序)
// 自定义排序(降序)
Collections.sort(nums, (a, b) -> b - a);
Collections.binarySearch()
)Collections.sort(nums); // 需先排序
int index = Collections.binarySearch(nums, 3); // 返回元素3的索引
List
时,需保证线程安全。Vector
(性能较低)。Collections.synchronizedList()
包装普通 List
:List safeList = Collections.synchronizedList(new ArrayList<>());
使用并发包 java.util.concurrent
中的 CopyOnWriteArrayList
(适用于读多写少场景):
List concurrentList = new CopyOnWriteArrayList<>();
ArrayList
扩容时会创建新数组并复制旧元素,若初始容量预估不足,多次扩容会导致性能下降。List list = new ArrayList<>(100); // 初始容量设为100,减少扩容次数
clear()
或置为 null
,帮助垃圾回收器回收内存。List
会存储 Object
类型,取出时需强制类型转换,可能引发 ClassCastException
。List list = new ArrayList<>(); // 限定只能存储String类型
特性 | List 接口特点 |
---|---|
核心优势 | 有序性、可重复性、索引访问,适用于需要按顺序操作的数据场景。 |
实现类选择 | - 高频查询:ArrayList - 高频增删: LinkedList - 线程安全: CopyOnWriteArrayList |
常用操作 | 添加 / 删除元素、遍历、排序、子列表操作、线程安全处理。 |
通过掌握 List
接口的核心方法与实现类特性,可在开发中高效处理线性数据集合,提升代码的健壮性与性能。