Java 为什么列表可以';不能使用数组初始化,而不使用数组。aslist()?

Java 为什么列表可以';不能使用数组初始化,而不使用数组。aslist()?,java,arrays,arraylist,Java,Arrays,Arraylist,Arrays.asList()声明如下 @SafeVarargs @SuppressWarnings("varargs") public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 但是这个呢 List<String> list = new ArrayList<>(new String[]{"hello"

Arrays.asList()
声明如下

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
但是这个呢

List<String> list = new ArrayList<>(new String[]{"hello", "world"});
但它实际上返回
ArrayList
对象。为什么可能出现这种情况?

Arrays.asList()是只读集合

要创建新的ArrayList(…),必须将集合作为参数传递


java中的集合是一个列表,集合实际上是数组。asList,但是
ArrayList
实际上并不是指我们都知道和喜欢的集合。它指的是
数组
类中的私有内部类。从第一个链接,即
asList
声明下方,您将看到:

/**
 * @serial include
 */
private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    ...
但是
java.util.ArrayList
类没有这样的构造函数,所以难怪您不能:

List<String> list = new ArrayList<>(new String[]{"hello", "world"});

我绝对不明白为什么这样的构造函数一开始就不存在于
java.util.ArrayList
中,而命名内部类
ArrayList
的决定更有趣。所以你只是找错了地方,没别的了

他们确实添加了这样的构造(!=
构造函数
),但仅在java-9中添加,并且仅在不可变集合中添加:

List<String> list = List.of(new String[]{"one"});
List List=List.of(新字符串[]{“一”});

吹毛求疵,但这不是构造函数,而是工厂方法。考虑到已经有一个与之完全相同的数组,
Arrays.asList()
@daniu注意,
Arrays.asList()
是可修改的,set/replaceAll会影响原始数组的内容,而
List.of
内容是原始数组的不可修改副本。
Arrays.asList("a", "b", "c").add("d");
List<String> list = List.of(new String[]{"one"});