一、集合与 List 概述
在 Java 编程中,集合框架提供了一种方便、高效的方式来管理对象组。集合类位于 java.util
包下,而 List
是其中一个重要的接口,继承自 Collection
接口,它允许存储有序(元素存入顺序和取出顺序一致)、可重复的元素集合。
二、List 的常用实现类
ArrayList
- 底层数据结构:基于动态数组实现。数组有初始容量(默认为 10),当元素数量超过容量时,会自动扩容(约 1.5 倍)。
- 特点:随机访问效率高,通过索引访问元素时间复杂度为 ,但在中间插入或删除元素相对低效,因为需要移动后续元素,时间复杂度为 。例如:
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>();
// 添加元素
arrayList.add("Apple");
arrayList.add("Banana");
arrayList.add("Cherry");
// 访问元素,索引从 0 开始
System.out.println(arrayList.get(1)); // 输出 Banana
// 修改元素
arrayList.set(2, "Durian");
// 遍历 ArrayList
for (String fruit : arrayList) {
System.out.println(fruit);
}
}
}
LinkedList
- 底层数据结构:采用双向链表实现,每个节点包含数据、前驱指针和后继指针。
- 特点:适合频繁在列表中间插入和删除操作,只需修改节点指针指向,时间复杂度为 ,但随机访问性能差,通过索引获取元素需从头或尾节点开始遍历链表,时间复杂度为 。示例代码:
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> linkedList = new LinkedList<>();
linkedList.add("Red");
linkedList.add("Green");
linkedList.add("Blue");
// 在头部插入元素
((LinkedList<String>) linkedList).addFirst("Yellow");
// 在尾部插入元素
((LinkedList<String>) linkedList).addLast("Purple");
// 遍历 LinkedList
for (String color : linkedList) {
System.out.println(color);
}
}
}
Vector
底层数据结构:类似 ArrayList,也是基于数组实现,但它是线程安全的(方法大多用 synchronized
修饰),而 ArrayList 是非线程安全的。不过在多线程并发访问不频繁场景,因同步开销,性能不如 ArrayList。示例:
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
vector.add(3);
// 遍历 Vector
for (int num : vector) {
System.out.println(num);
}
}
}
三、List 的通用操作方法
添加元素
add(E element)
:在列表末尾添加指定元素,E
是元素类型。例如list.add("newItem");
。add(int index, E element)
:在指定索引位置插入元素,索引之后元素依次后移。
访问元素:get(int index)
返回列表中指定索引处的元素,注意索引不能越界(小于 0 或大于等于列表大小),否则抛出 IndexOutOfBoundsException
。
修改元素:set(int index, E element)
用指定元素替换列表指定索引位置的原有元素,并返回被替换的旧元素。
删除元素
remove(int index)
:移除列表指定索引处的元素,后续元素前移,返回被移除的元素。remove(Object o)
:从列表中移除指定对象首次出现的位置(若存在),若列表不存在该对象则不操作,返回是否移除成功的布尔值。
查找元素:indexOf(Object o)
返回指定对象在列表中首次出现的索引,若不存在返回 -1;lastIndexOf(Object o)
则返回最后一次出现的索引,同样不存在返回 -1。
获取列表大小:size()
返回列表中当前元素个数。
四、List 的遍历方式
普通 for 循环遍历:利用索引按顺序访问元素,适合在需要按索引操作、修改元素场景,如:
List<String> list = new ArrayList<>();
// 添加元素操作略
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
增强 for 循环(foreach)遍历:简洁遍历元素,不能修改元素本身(修改只是副本),示例:
for (String item : list) {
System.out.println(item);
}
迭代器遍历(Iterator):通过迭代器对象 Iterator
,可安全地在遍历同时删除元素,代码如下:
import java.util.Iterator;
import java.util.List;
// 假设已有 List<String> list 实例化并添加元素
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("target")) {
iterator.remove();
}
}
掌握 Java 集合 List
的这些知识,能在处理有序、可重复元素集合场景高效编写代码,灵活应对数据存储与操作需求。后续可深入研究各实现类底层源码优化、性能瓶颈突破及与其他集合类型转换协作等进阶内容。