好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

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

而List.of()不可以

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import java.util.List;

import java.util.Arrays;

class Solution {

     public static void main(String[] args) {

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

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

      System.out.println(ls1);

      //System.out.println(ls2);

     }

}

 

/*结果

[1, 2, null]

*/

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import java.util.List;

import java.util.Arrays;

class Solution {

     public static void main(String[] args) {

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

      List<Integer> 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。上面结果也可得知。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import java.util.List;

import java.util.Arrays;

class Solution {

     public static void main(String[] args) {

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

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

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

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

     }

}

 

/*结果

true

*/

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import java.util.List;

import java.util.Arrays;

class Solution {

     public static void main(String[] args) {

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

      List<Integer> 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能修改。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import java.util.List;

import java.util.Arrays;

class Solution {

     public static void main(String[] args) {

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

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

      ls1.set( 0 , 5 );

      //ls2.set(0,5);

      System.out.println(ls1);

      //System.out.println(ls2);

     }

}

 

/*结果

[5, 2, null]

*/

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import java.util.List;

import java.util.Arrays;

class Solution {

     public static void main(String[] args) {

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

      List<Integer> 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无影响

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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<Integer> ls1 = Arrays.asList(a);

      //List<Integer> 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]

*/

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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<Integer> ls1 = Arrays.asList(a);

      List<Integer> 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有关的源码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

    @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源码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

     @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的,所以支持修改。

java listof报错处理

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/qq_42520962/article/details/109380430

查看更多关于Java中List.of()和Arrays.asList()的区别及原因分析的详细内容...

  阅读:34次