关于将数组转为list的方法Arrays.asList(arr)的缺陷
来源:互联网 发布:无光源网络是什么意思 编辑:程序博客网 时间:2024/05/17 13:40
对于多数人来说,想要将某个数组转为List都会选择Arrays类的asList()方法。其实这个方法并不能应付所有情况。请看下面的示例:
package com;import java.util.Arrays;import java.util.List;public class Test { public static void main(String[] args) { String[] arr = {"aaa", "bbb", "ccc"}; List<String> list = Arrays.asList(arr); list.add("ddd"); for(String str : list) System.out.println(str); }}
主方法运行出错,抛异常
我们来看一下Arrays.asList()的源码:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
第一眼看上去好像没什么问题。实际上这里面的ArrayList并不是“真正的”ArrayList ,而是Arrays类的一个内部list实现类,也就是说asList方法返回的是一个在工具类内部定义的迷你版List实现。这个类继承自AbtractList ,没有自己的add()方法,所以示例中的 list.add("ddd") 调用的是 AbtractList 的 add() 。请看AbtractList类的源码:
public boolean add(E e) { add(size(), e); return true; } public void add(int index, E element) { throw new UnsupportedOperationException(); }
由源码可知调用这个迷你版ArrayList的add方法时会抛出 UnsupportedOperationException 。至此,运行示例代码出错也就可以理解了。
解决办法:
既然asList方法返回的不是我们想要的类,换一个可用的实现类就可以了,下面是修改后的实例:
package com;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Test { public static void main(String[] args) { String[] arr = {"aaa", "bbb", "ccc"}; List<String> list = new ArrayList<String>(Arrays.asList(arr)); list.add("ddd"); for(String str : list) System.out.println(str); }}
但是查看源码可知带Collection参数的ArrayList构造方法内部代码并不高效,下面是更高效的代码:
package com;import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { String[] arr = {"aaa", "bbb", "ccc"}; List<String> list = new ArrayList<String>(); for(String str : arr) list.add(str); list.add("ddd"); for(String str : list) System.out.println(str); }}
看起来有些啰嗦,如果想简单点可以这样写:
package com;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Test { public static void main(String[] args) { String[] arr = {"aaa", "bbb", "ccc"}; List<String> list = new ArrayList<String>(); Collections.addAll(list, arr); list.add("ddd"); for(String str : list) System.out.println(str); }}
这么写跟前面那个在for循环中一个个add效率上几乎一样,原因看Collections类的源码:
public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element); return result; }
可见,也是for里面一个个add,本质上区别不大。
阅读全文
0 0
- 关于将数组转为list的方法Arrays.asList(arr)的缺陷
- 使用Arrays的asList方法将数组变成List集合
- Arrays.asList 数组转为list使用注意
- 关于Arrays的asList()
- 基本类的数组利用Arrays.asList方法转换成list
- 关于Arrays.asList的问题
- Arrays.asList方法创建List需要注意的地方
- Arrays的asList方法注意事项
- Arrays.asList方法的漏洞
- Arrays.asList()方法的使用
- Arrays.asList()方法的使用
- Java利用Arrays的asList方法输出数组数据
- Java利用Arrays的asList方法输出数组数据
- 关于Arrays.asList(T... a)方法的使用注意事项
- Arrays.asList()返回的List特点
- Arrays.asList()返回只读的List
- asList的缺陷
- Java中Arrays的asList()方法
- es6基础笔记整理
- 654. Maximum Binary Tree
- linux中readl()和writel()函数
- 【Scikit-Learn 中文文档】特征选择
- 响应式双飞翼雪碧图居中方法
- 关于将数组转为list的方法Arrays.asList(arr)的缺陷
- OIer JCY
- 解决问题:编译Latex遇到 file ended while scanning use of \@xdblarg or \@frac
- python中在list中添加字典遇到的问题
- 个位数统计 (15)python3
- 【Scikit-Learn 中文文档】半监督学习
- [16]_总结嵌入式系统的组成
- 移动Web入门
- 【Scikit-Learn 中文文档】概率校准