概述
在 Java 中,列表(List) 是一种有序的集合,它允许元素重复,并且每个元素都有一个对应的索引值。Java 提供了 List 接口及其实现类,用于表示和操作列表数据。常用的实现类包括 ArrayList、LinkedList 和 Vector。
1、List接口概述
List 是 Java 集合框架中的一种接口,继承自 Collection 接口。它定义了许多常见的操作,如:
添加元素:add(E e)、add(int index, E element)
删除元素:remove(Object o)、remove(int index)
获取元素:get(int index)
修改元素:set(int index, E element)
查找元素:indexOf(Object o)、lastIndexOf(Object o)
获取列表大小:size()
判断是否包含元素:contains(Object o)
List 接口的常见方法:
add(E e):将元素添加到列表的末尾。
add(int index, E element):将元素插入到指定位置。
get(int index):返回指定位置的元素。
set(int index, E element):用指定元素替换指定位置的元素。
remove(int index):移除指定位置的元素。
remove(Object o):移除指定的元素。
contains(Object o):判断列表是否包含某个元素。
indexOf(Object o):返回某个元素首次出现的索引,若不存在则返回 -1。
size():返回列表的大小(元素个数)。
isEmpty():判断列表是否为空。
2、常见的List实现类
Java 提供了几种 List 接口的实现类,常用的有:
ArrayList:基于动态数组实现的列表,提供快速的随机访问,但插入和删除操作相对较慢,尤其是在中间插入时。
LinkedList:基于双向链表实现的列表,提供较快的插入和删除操作,但随机访问较慢。
Vector:类似于 ArrayList,但它是同步的,适用于多线程环境,不过现在通常推荐使用 ArrayList,除非你有线程安全的需求。
2-1、ArrayList
ArrayList 是基于数组实现的动态大小的列表。它提供了按索引快速访问元素的能力。虽然它的删除和插入操作相对较慢(特别是在中间位置),但其查找操作非常快速。
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();// 添加元素list.add("Alice");list.add("Bob");list.add("Charlie");// 获取元素System.out.println("第一个元素: " + list.get(0)); // AliceSystem.out.println("第二个元素: " + list.get(1)); // Bob// 修改元素list.set(1, "David");// 删除元素list.remove(0); // 移除第一个元素// 打印列表System.out.println("更新后的列表: " + list);}
}
2-2、LinkedList
LinkedList 是基于双向链表实现的列表,提供更高效的插入和删除操作,但它的随机访问性能较差(需要从头开始遍历链表)。LinkedList 也实现了 Deque 接口,允许它在列表两端进行插入和删除操作。
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> list = new LinkedList<>();// 添加元素list.add("Alice");list.add("Bob");list.add("Charlie");// 获取元素System.out.println("第一个元素: " + list.get(0)); // Alice// 修改元素list.set(1, "David");// 删除元素list.remove(0); // 移除第一个元素// 打印列表System.out.println("更新后的列表: " + list);}
}
2-3、Vector
Vector 类是 ArrayList 的早期实现,与 ArrayList 类似,但它是线程安全的。由于其线程同步的特性,性能相较于 ArrayList 较低,因此不再推荐使用,除非需要多线程环境下的线程安全性。
3、of方法
of 是 Java 9 引入的一个 静态工厂方法,它用于快速创建不可变的集合(如 Set、List、Map 等)。在 List、Set 和 Map 等集合的类中,of 方法使得你可以更方便地初始化集合,而无需手动调用 add 方法或构造函数。
of 方法的使用,特别是在 List 上,允许你以简洁的方式创建一个包含固定元素的列表。
3-1、List.of()方法
List.of() 是 List 接口的一个静态方法,用于创建不可变的列表(即一旦创建,无法修改其内容)。与传统的通过 add() 方法添加元素的方式相比,List.of() 使得初始化 List 更加简洁和直接。
3-2、List.of() 创建不可变列表
可以使用 List.of() 方法来快速创建一个包含元素的不可变列表。这个列表一旦创建后,不能再进行添加、删除或修改操作(即它是 不可变的)。
import java.util.List;public class ListOfExample {public static void main(String[] args) {// 使用 List.of() 创建一个包含三个元素的不可变 ListList<String> list = List.of("Apple", "Banana", "Cherry");// 打印列表System.out.println(list); // [Apple, Banana, Cherry]// 尝试修改列表会抛出 UnsupportedOperationException// list.add("Date"); // 会抛出 UnsupportedOperationException}
}
3-3、List.of()方法的特点
不可变性:由 List.of() 创建的列表是不可变的。这意味着不能对该列表进行元素的添加、删除或修改等操作。例如,调用 add() 或 remove() 方法会抛出 UnsupportedOperationException 异常。
简洁性:List.of() 提供了简洁的语法来快速初始化一个包含固定元素的列表,而不需要使用 new ArrayList<>() 和 add()。
元素限制:List.of() 最多支持创建包含 10 个元素的列表。如果传入的元素超过 10 个,List.of() 会根据参数自动构造适当大小的列表。
注意:
可以使用 List.of() 创建一个不可变的 List,然后将其复制到一个新的可变列表(如 ArrayList),并对复制的列表进行修改。这种方式利用了 List.of() 创建的不可变列表的简洁性,同时又能保留对新列表的修改能力。
可以通过 new ArrayList<>(List.of(…)) 或 Collections.addAll() 方法来复制一个不可变的 List。这里我们使用 ArrayList 来创建一个新的可变列表,它会复制不可变列表中的所有元素。
import java.util.List;
import java.util.ArrayList;public class CopyListExample {public static void main(String[] args) {// 使用 List.of() 创建一个不可变的 ListList<String> immutableList = List.of("Apple", "Banana", "Cherry");// 复制到一个可变的 ArrayListList<String> mutableList = new ArrayList<>(immutableList);// 修改可变列表mutableList.add("Date"); // 添加元素mutableList.set(1, "Grapes"); // 修改索引 1 的元素// 打印修改后的列表System.out.println("原不可变列表: " + immutableList); // [Apple, Banana, Cherry]System.out.println("修改后的可变列表: " + mutableList); // [Apple, Grapes, Cherry, Date]}
}