gpt4 book ai didi

java - 为什么列表不能用数组初始化,没有arrays.aslist()?

转载 作者:行者123 更新时间:2023-12-05 09:07:43 30 4
gpt4 key购买 nike

Arrays.asList() 声明如下。

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

因此,如您所知,要使用数组初始化具体的 List,您可以这样做:

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

但是这个呢?

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

我预计它会起作用,但没有。

我明白为什么。这是因为 ArrayList 的构造函数之一需要 Collection 类。

那么,Arrays.asList() 呢?

Varargs 被编译为数组,所以也许该方法会被编译如下。

public static <T> List<T> asList(T[] a) {
return new ArrayList<>(a);
}

但它实际上返回的是ArrayList 对象。为什么这是可能的?

最佳答案

确实,Arrays.asList is implemented as you said ,但是ArrayList实际上并不是指 java.util.ArrayList 我们都知道并喜爱。它指的是Arrays中的私有(private)内部类类(class)。从第一个链接开始,就在 asList 的声明下,你会看到:

/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
...

new ArrayList<>(a)指的是上面的类。上面的类有一个构造函数,它接受 E[]。 :

    ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}

但是 java.util.ArrayList类没有这样的构造函数,所以难怪你不能这样做:

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

java.util.ArrayList 之间的另一个大区别和 java.util.Arrays$ArrayList是您可以向前者添加/删除元素,但不能向后者添加/删除元素。例如这会引发异常:

Arrays.asList("a", "b", "c").add("d");

关于java - 为什么列表不能用数组初始化,没有arrays.aslist()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64601559/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com