如何解决为什么没有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.ArrayList
和java.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 举报,一经查实,本站将立刻删除。