Java中List.of()和Arrays.asList()的区别及原因分析
目录
- Java中List.of()和Arrays.asList()的区别及原因
- 1.Arrays.asList()可以插入null
- 2.用List.of的List自然是不包含null
- 3.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) {Listls1 = 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 static void main(String[] args) {//Listls1 = 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) {Listls1 = 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) {//Listls1 = 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) {Listls1 = 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) {//Listls1 = 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 具有不兼容的上限Listls1 = 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}; //Listls1 = 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")staticList of(E... elements) {switch (elements.length) { // implicit null check of elementscase 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); }}//---------------------------------------------------------------------------------------@Stableprivate final E[] elements; @SafeVarargsListN(E... input) {// copy and check manually to avoid TOCTOU@SuppressWarnings("unchecked")E[] tmp = (E[])new Object[input.length]; // implicit nullcheck of inputfor (int i = 0; i < input.length; i++) {tmp[i] = Objects.requireNonNull(input[i]); }elements = tmp; } //--------------------------------------------------------------------------------------- public static 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 staticList 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版本及以后才能运行。
【Java中List.of()和Arrays.asList()的区别及原因分析】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募