首页 > 编程语言 >【java技术总结】Java-9中List.of()和Arrays.asList()的区别及原因分析

【java技术总结】Java-9中List.of()和Arrays.asList()的区别及原因分析

时间:2022-11-04 12:47:29浏览次数:45  
标签:elements Java Arrays List 数组 new asList

1.List.of()和Arrays.asList()的区别?

  1. List.of()不可以插入null,Arrays.asList()可以。
  2. List.of()生成的List不可以修改,Arrays.asList()可以。
  3. List.of()原数组修改不会影响生成数组,Arrays.asList()会。

2.原因

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

标签:elements,Java,Arrays,List,数组,new,asList
From: https://www.cnblogs.com/blanset/p/16857376.html

相关文章

  • 13. Java 面向对象编程
    Java面向对象编程Java的核心思想就是OOP1.初识面向对象面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么.....面对过程适合处理一些......
  • java如何实现原子操作CAS
    在Java中可以通过锁和循环CAS的方式来实现原子操作。使用循环CAS实现原子操作JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行......
  • java api 视频面试准备
    Java api知识点总结1.单例设计模式:通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问懒汉式:先对对象进行初始化恶汉式(延时加载用到的是恶汉式):先在堆......
  • 前端100题」包含算法、Vue、Reac、Javascript、浏览器等真题和答案
    目录(https://github.com/Advanced-Frontend/Daily-Interview-Question)第1题:写React/Vue项目时为什么要在列表组件中写key,其作用是什么?.6第2题:['1','2','3'......
  • 常用的前端JavaScript方法封装
    1、输入一个值,返回其数据类型**functiontype(para){returnObject.prototype.toString.call(para)}2、数组去重functionunique1(arr){return[...newS......
  • Java守护线程
    Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。守护线程是所有非守护线程的保姆,当所有非守护线程执行完成或退出了,即使还有守护线程在运行,JVM也会直接退......
  • 案例2:JAVA GUI 简易计算器
    使用javaGUI实现计算器的基本功能,包含一个帮助说明页面,提示用户如何使用。包含一个计算器主界面,要实现基本的加法、减法、乘法、除法运算。1.帮助界面   Help.java......
  • 案例3:JAVA GUI 随机点名程序
    先开发一个姓名维护的界面,输入学生的姓名,每行录入一个学生姓名,点击保存的时候将学生的姓名保存到一个txt文件中。再开发一个点名的程序,从维护好的txt文件中,随机读取一个学......
  • JavaIo案例
    FIleFIle是文件对象,可以表示一个文件,也可以表示文件夹。研究其源码,没有什么意义,我们要做的,是研究怎么用。常用的文件操作方式一:根据路径创建一个文件(只能创建在磁盘根......
  • Java学习——11.04
    因为昨天学的有点少,上不了台面,所以和今天的一起写,当然还可能是自己太懒了,昨天的没记住,于是又看了一遍。1.变量:局部变量(和C一样的)实例变量(加new引用文件名创建函数......