Java中List.of()和Arrays.asList()的区别及原因分析

网友投稿 339 2022-12-12

Java中List.of()和Arrays.asList()的区别及原因分析

目录java中List.of()和Arrays.asList()的区别及原因1.Arrays.asList()可以插入null2.用List.of的List自然是不包含null3.List.of生成的List不能修改4.关于数组修改对List的影响原因java listof报错处理

Java中List.of()和Arrays.asList()的区别及原因

动手写一下,让自己更有印象

1.Arrays.asList()可以插入null

而List.of()不可以

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

List ls1 = Arrays.asList(1, 2, null);

//List ls2 = List.of(1,2,null);

System.out.println(ls1);

//System.out.println(ls2);

}

}

/*结果

[1, 2, null]

*/

import java.util.List;

import java.util.Arrays;

class Solution {

public staqterMgatic void main(String[] args) {

//List ls1 = Arrays.asList(1, 2, null);

List ls2 = List.of(1,2,null);

//System.out.println(ls1);

System.out.println(ls2);

}

}

/*结果

Exception in thread "main" java.lang.NullPointerException.....

*/

2.用List.of的List自然是不包含null

而用Arrays.asList的List包含null。上面结果也可得知。

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

List ls1 = Arrays.asList(1, 2, null);

//List ls2 = List.of(1,2);

System.out.println(ls1.contains(null));

//System.out.println(ls2.contains(null));

}

}

/*结果

true

*/

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

//List ls1 = Arrays.asList(1, 2, null);

List ls2 = List.of(1,2);

//System.out.println(ls1.contains(null));

System.out.println(ls2.contains(null));

}

}

/*结果

Exception in thread "main" java.lang.NullPointerException.....

*/

3.List.of生成的List不能修改

Arrays.asList生成的List能修改。

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

List ls1 = Arrays.asList(1, 2, null);

//List ls2 = List.of(1,2);

ls1.set(0,5);

//ls2.set(0,5);

System.out.println(ls1);

//System.out.println(ls2);

}

}

/*结果

[5, 2, null]

*/

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

//List ls1 = Arrays.asList(1, 2, null);

List ls2 = List.of(1,2);

//ls1.set(0,5);

ls2.set(0,5);

//System.out.println(ls1);

System.out.println(ls2);

}

}

/*结果

Exception in thread "main" java.lang.UnsupportedOperationExceptio.....

*/

4.关于数组修改对List的影响

数组修改对Arrays.asList生成的List有影响,对List.of 生成的List无影响

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

Integer[] a = new Integer[]{1,2,3,4};

// 不能用int[],会导致转型错误,错误: 不兼容的类型: 推论变量 T 具有不兼容的上限

List ls1 = Arrays.asList(a);

//List ls2 = List.of(a);

System.out.println(ls1);

//System.out.println(ls2);

a[0] = 5;

//ls2.set(0,5);

System.out.println(ls1);

//System.out.println(ls2);

}

}

/*结果

[1, 2, 3, 4]

[5, 2, 3, 4]

*/

import java.util.List;

import java.util.Arrays;

class Solution {

public static void main(String[] args) {

Integer[] a = new Integer[]{1,2,3,4};

//List ls1 = Arrays.asList(a);

List ls2 = List.of(a);

//System.out.println(ls1);

System.out.println(ls2);

a[0] = 5;

//ls2.set(0,5);

//System.out.println(ls1);

System.out.println(ls2);

}

}

/*结果

[1, 2, 3, 4]

[1, 2, 3, 4]

*/

原因

关于List.of为什么不能插入null,和修改了原数组不影响到List.of生成的List。先看看List.of有关的源码

@SafeVarargs

@SuppressWarnings("varargs")

static List 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 stahttp://tic 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 List asList(T... a) {

return new ArrayList<>(a);

}

//----------------------------------------------------------------------------------------

ArrayList(E[] array) {

a = Objects.requireNonNull(array);

}

//----------------------------------------------------------------------------------------

public static T requireNonNull(T obj) {

if (obj == null)

throw new NullPointerException();

return obj;

}

由源码可知,底层的数组就是传入的数组,所以对原数组的修改会影响到用Arrays.asList方法生成的List。而且Objects.requireNonNull(array)检查的是整个数组是不是null,而非对每个元素进行检查是否为null。所以用Arrays.asList方法可以插入空值。

也没有规定是final的,所以支持修改。

java listof报错处理

List.of()生成不可变数组(字符串也行)

是在jdk1.8以后才出现的,在jdk1.9版本及以后才能运行。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Java的guava开源库工具类
下一篇:Kotlin修饰符lateinit(延迟初始化)案例详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~