第一种情况:
import java.util.Arrays;
import java.util.List;
public class ArraysTest {
public static void main(String[] args) {
String[] str = {"a", "b", "c", "d"};
List<String> list = Arrays.asList(str);
list.add("e");
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at ArraysTest.main(ArraysTest.java:8)
第二种情况:
import java.util.Arrays;
import java.util.List;
public class ArraysTest {
public static void main(String[] args) {
String[] str = {"a", "b", "c", "d"};
List<String> list = Arrays.asList(str);
str[0] = "e";
System.out.println("list = " + list);
}
}
list = [e, b, c, d]
源码
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
// ...
}
private final E[] a;
a = Objects.requireNonNull(array);
从上面两行代码可以得知其本质还是数组,所以 Arrays.asList() 可以看作一种数据适配器,将数组类型的数据转化为集合容器类型。
参考资料
《Java开发手册(嵩山版)》/ P17
《设计模式之美》/ 51 | 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?