在Java中,List接口是集合框架(Collections Framework)的一部分,用于表示有序的集合(也称为序列)。List允许存储重复的元素,并且可以通过索引访问元素。以下是对Java中List的详细介绍:
- List接口概述
有序性:List中的元素是有序的,可以通过索引访问。
允许重复:List允许存储重复的元素。
动态调整大小:List可以根据需要动态调整大小。
- List接口的主要实现类
Java提供了多个List接口的实现类,常用的包括:
a. ArrayList
实现方式:基于动态数组实现。
特点:
访问速度快(通过索引访问的时间复杂度为O(1))。
适合频繁的随机访问。
插入和删除操作在中间位置时性能较低(需要移动元素)。
使用场景:适用于需要频繁随机访问元素的场景。
java
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list);
}
}
b. LinkedList
实现方式:基于双向链表实现。
特点:
插入和删除操作在中间位置时性能较高(不需要移动元素,只需调整指针)。
随机访问性能较低(需要从头或尾遍历链表)。
使用场景:适用于需要频繁在中间位置插入和删除元素的场景。
java
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list);
}
}
c. Vector
实现方式:类似于ArrayList,但线程安全。
特点:
所有方法都是同步的(线程安全)。
性能比ArrayList低,因为同步开销较大。
使用场景:适用于多线程环境下的集合操作。
java
import java.util.List;
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
List<String> list = new Vector<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list);
}
}
d. Stack
实现方式:继承自Vector,提供了栈(LIFO)的行为。
特点:
提供了push(), pop(), peek()等方法。
不推荐使用,因为Deque接口提供了更完整和现代的栈操作。
使用场景:需要栈行为的场景,但更推荐使用Deque的实现类如ArrayDeque。
java
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("Apple");
stack.push("Banana");
stack.push("Cherry");
System.out.println(stack.pop()); // 输出: Cherry
System.out.println(stack.peek()); // 输出: Banana
}
}
- List接口的主要方法
以下是List接口中一些常用的方法:
添加元素:
boolean add(E e): 在列表末尾添加元素。
void add(int index, E element): 在指定位置插入元素。
删除元素:
boolean remove(Object o): 删除第一个匹配的元素。
E remove(int index): 删除指定位置的元素。
获取元素:
E get(int index): 获取指定位置的元素。
设置元素:
E set(int index, E element): 替换指定位置的元素。
查找元素:
int indexOf(Object o): 返回第一个匹配元素的索引。
int lastIndexOf(Object o): 返回最后一个匹配元素的索引。
其他方法:
int size(): 返回列表的大小。
boolean isEmpty(): 判断列表是否为空。
void clear(): 清空列表。
boolean contains(Object o): 判断列表中是否包含指定元素。
List<E> subList(int fromIndex, int toIndex): 返回列表的子列表。
- 遍历List的方法
a. 使用传统的for循环
java
for (String item : list) {
System.out.println(item);
}
c. 使用迭代器(Iterator)
java
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
d. 使用forEach和Lambda表达式
java
list.forEach(item -> System.out.println(item));
e. 使用Stream API
java
list.stream().forEach(System.out::println);