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

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

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

2|02.原因

2|1先说结论:

  1. List.of不能插入null,但是Arrays.asList()可以。因为List.of对于生成的数组的每个元素判空,而Arrays.asList()是对整个数组进行判空。
  2. List.of不能修改生成数组,Arrays.asList()可以。因为List.of底层有final修饰,而Arrays.asList()没有。
  3. List.of()原数组修改不会影响生成数组,Arrays.asList()会。因为List.of底层创建了新数组,而List.of()原数组修改不会影响生成数组,Arrays.asList()底层使用原来的数组。

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

3|03.扩展

  • List.of()是java9开始的,同样的还有Set.of()、Map.of()
  • 使用方法:
List<Integer> list = List.of(1,2,3,4);//[1,2,3,4] Set<Integer> set = Set.of(1,2,3,4);//[1,2,3,4] Map<Integer,Integer> map = Map.of(1,2,3,4);//{1=2,3=4}

__EOF__

本文作者blanset
本文链接https://www.cnblogs.com/blanset/p/16857376.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   求道之愚者  阅读(1076)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示