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"});