Arrays.asList("a", "b", "c") 是 Java 中用于快速创建固定大小的列表的工具方法
1. 方法作用
-
功能:将传入的数组或可变参数转换为一个 List 集合。
-
示例
List<String> list = Arrays.asList("a", "b", "c"); // 等价于创建一个包含 ["a", "b", "c"] 的列表
2. 关键特性
(1) 固定大小(不可添加/删除元素)
-
返回的列表是
基于原始数组的视图,长度固定:
list.add("d"); // ❌ 抛出 UnsupportedOperationException list.remove(0); // ❌ 同样抛出异常
-
原因:底层实现是 Arrays 的内部类 ArrayList(非 java.util.ArrayList),未实现增删方法。
(2) 可修改元素(但不可改变结构)
-
支持通过索引修改元素值:
list.set(0, "A"); // ✅ 允许修改:["A", "b", "c"]
(3) 与原数组的关联
-
列表和原数组
共享数据(修改会互相影响):
String[] arr = {"a", "b", "c"}; List<String> list = Arrays.asList(arr); arr[0] = "X"; // 修改数组 System.out.println(list); // 输出 [X, b, c] list.set(1, "Y"); // 修改列表 System.out.println(Arrays.toString(arr)); // 输出 [X, Y, c]
-
底层
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这个new调用的其实是Arrays里自定义的内部类
编译器的查找顺序:
-
首先查找 当前类(
Arrays
)的内部类 → 找到private static class ArrayList
-
若未找到,才会查找 导入的包(如
java.util.ArrayList
)
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
@java.io.Serial
private static final long serialVersionUID = -2764017481108945198L;
@SuppressWarnings("serial") // Conditionally serializable
private final E[] a;
// 步骤分解:
// 1. 编译器识别new ArrayList<>(a)
// 2. 在Arrays类内部找到private static ArrayList类
// 3. 调用其显式定义的构造器:
ArrayList(E[] array) {
a = Objects.requireNonNull(array);//就是调用这个
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return Arrays.copyOf(a, a.length, Object[].class);
}
@Override
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
不可变的核心原因
-
自定义的
ArrayList
继承自AbstractList
,未重写add/remove
方法。从AbstractList
继承的默认实现会抛出UnsupportedOperationException
,确保了固定大小。