Java中List.of()和Arrays.asList()的区别及原因分析
作者:爱唱歌的瓜皮 发布时间:2023-08-06 00:33:16
标签:Java,List.of,Arrays.asList
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<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]
*/
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。上面结果也可得知。
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
*/
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能修改。
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]
*/
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无影响
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]
*/
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有关的源码
@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的,所以支持修改。
java listof报错处理
List.of()生成不可变数组(字符串也行)
是在jdk1.8以后才出现的,在jdk1.9版本及以后才能运行。
来源:https://blog.csdn.net/qq_42520962/article/details/109380430


猜你喜欢
- 核心代码: File fatherFile = new File(path);File[] files = fatherFile.listF
- 1.概述项目中经常会遇到一个应用需要访问多个数据源的情况,本文介绍在SpringBoot项目中利用SpringDataJpa技术如何支持多个
- 配置注解的支持:在spring4之后,想要使用注解形式,必须得要引入 aop 的包<dependency><groupId
- 概述java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的
- 一,使用背景之前遇到一个需求,是需要将一个json文件解析存储到数据库中。一开始测试的时候,json文件的大小都在几兆以内,所以直接将jso
- 这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信。注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中
- 最近项目中遇到一个问题,在用户没填数据的时候,我们需要接收从前端传过来的对象为null,但是前端说他们一个一个判断特别麻烦,只能传个空对象过
- XML假如有这样一个XML格式的数据:<?xml version="1.0" encoding="utf
- 本文主要介绍我为桌面和 Web 设计的一个超级秘密 Flutter 项目使用了画布和可拖动节点界面。本教程将展示我如何使用堆栈来使用小部件完
- 一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑,特别是在不同方法
- rocketmq client 日志的问题处理使用rocketmq后,默认会在{user.home}\logs\rocketmqlogs 目
- 首先要解析string类型的xml必须先要将其转化成dom格式,然后再进行解析取值,如下是解析代码示例:package com.compan
- C#开发WinForm,如何实现TextBox获取输入焦点时自动全选?&nbs
- 前言本文主要写的是:springboot下ueditor上传功能的实现及遇到的一些问题的处理整体项目结构展示Springboot整合uedi
- 本文实例讲述了Android编程之绘制文本(FontMetrics)实现方法。分享给大家供大家参考,具体如下:Canvas 作为绘制文本时,
- 准备:wildfly/tomcat或者其他服务器你的数据库的Driver,(此处用的mysql-connecter-java-5.1.39-
- 本文实例为大家分享了C#截取验证码图片的具体代码,供大家参考,具体内容如下使用Graphics类中的DrawImage方法,这个方法有30种
- springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件先
- createCoroutine 和 startCoroutine协程到底是怎么创建和启动的?本篇文章带你揭晓。在Continuation.k
- 1. 首先新建一个shiroConfig shiro的配置类,代码如下:@Configurationpublic class SpringS