微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么没有arrays.aslist无法用数组初始化list?

如何解决为什么没有arrays.aslist无法用数组初始化list?

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()呢?

变量被编译为数组,因此该方法可能如下编译。

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类中的私有内部类。在第一个链接的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.ArrayListjava.util.Arrays$ArrayList之间的另一个大区别是,您可以在前者中添加/删除元素,但不能在后者中添加/删除元素。例如这将引发异常:

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

我绝对不明白为什么java.util.ArrayList中不存在这样的构造函数,而决定命名内部类ArrayList的原因也更有趣。因此,您只是在错误的地方寻找,仅此而已。

它们 did 添加了这样的构造(!= {constructor),但仅在java-9中并且仅对不可变的集合:

List<String> list = List.of(new String[]{"one"});
,

Arrays.asList()是只读集合。

您必须将一个集合作为参数传递给新的ArrayList(...)。

java中的集合是列表,集合

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。