【java技术总结】Java-9中List.of()和Arrays.asList()的区别及原因分析
1.List.of()和Arrays.asList()的区别?
- List.of()不可以插入null,Arrays.asList()可以。
- List.of()生成的List不可以修改,Arrays.asList()可以。
- List.of()原数组修改不会影响生成数组,Arrays.asList()会。
2.原因
先说结论:
- List.of不能插入null,但是Arrays.asList()可以。因为List.of对于生成的数组的每个元素判空,而Arrays.asList()是对整个数组进行判空。
- List.of不能修改生成数组,Arrays.asList()可以。因为List.of底层有final修饰,而Arrays.asList()没有。
- List.of()原数组修改不会影响生成数组,Arrays.asList()会。因为List.of底层创建了新数组,而List.of()原数组修改不会影响生成数组,Arrays.asList()底层使用原来的数组。
关于List.of为什么不能插入null,和修改了原数组不影响到List.of生成的List。先看看List.of有关的源码
@SafeVarargs
@SuppressWarnings("varargs")
static <E> List<E> of(E... elements) {
switch (elements.length) { // implicit null check of elements
case 0:
return ImmutableCollections.emptyList();
case 1:
return new ImmutableCollections.List12<>(elements[0]);
case 2:
return new ImmutableCollections.List12<>(elements[0], elements[1]);
default:
return new ImmutableCollections.ListN<>(elements);
}
}
//---------------------------------------------------------------------------------------
@Stable
private final E[] elements;
@SafeVarargs
ListN(E... input) {
// copy and check manually to avoid TOCTOU
@SuppressWarnings("unchecked")
E[] tmp = (E[])new Object[input.length]; // implicit nullcheck of input
for (int i = 0; i < input.length; i++) {
tmp[i] = Objects.requireNonNull(input[i]);
}
elements = tmp;
}
//---------------------------------------------------------------------------------------
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
可以看到Objects.requireNonNull()。所以不能插入空值。
E[] tmp = (E[])new Object[input.length];表示新建了个新的数组对象,所以修改了原数组,不影响生成的LIst底层的数组。
返回的数组是个final类型的,所以不能修改
再看看Arrays.asList源码
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
//----------------------------------------------------------------------------------------
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
//----------------------------------------------------------------------------------------
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
由源码可知,底层的数组就是传入的数组,所以对原数组的修改会影响到用Arrays.asList方法生成的List。而且Objects.requireNonNull(array)检查的是整个数组是不是null,而非对每个元素进行检查是否为null。所以用Arrays.asList方法可以插入空值。
也没有规定是final的,所以支持修改。
3.扩展
- List.of()是java9开始的,同样的还有Set.of()、Map.of()
- 使用方法:
List<Integer> list = List.of(1,2,3,4);//[1,2,3,4]
Set<Integer> set = Set.of(1,2,3,4);//[1,2,3,4]
Map<Integer,Integer> map = Map.of(1,2,3,4);//{1=2,3=4}
作者:blanset
出处:https://www.cnblogs.com/blanset/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号