标签:java Arrays list ArrayList List datas Java asList
Arrays.asList用来将数组转化为List,这个看似功能很明了的方法却暗藏玄机。
请先看下面的程序:
int[] datas = new int[]{1,2,3,4,5};
List list = Arrays.asList(datas);
System.out.println(list.size());
运行结果是1。一个长度为5的数组,转化为List后,长度却成了1。
再对这个程序稍加修改:
Integer[] datas = new Integer[]{1,2,3,4,5};
List list = Arrays.asList(datas);
System.out.println(list.size());
运行结果为5。
同样的代码,只是将数组的类型由原来的基本类型改变为包装类型,转化后的List却不一样,这是为什么?
看一下asList的代码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
asList接受的是一个泛型类型的参数,再构造了一个ArrayList。然而基本类型是不支持泛型化的,但是数组支持,所以采用基本类型的数组转化后是将数组放入了构造的ArrayList中,长度是1。
再接着看,这个坑过去了,兴高采烈的想要往转化后的List中添加些元素:
Integer[] datas = new Integer[]{1,2,3,4,5};
List list = Arrays.asList(datas);
list.add(6);
然后运行后却抛出了java.lang.UnsupportedOperationException异常,
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.cxm.demo.DemoMain.main(DemoMain.java:11)
这是怎么回事?
原来asList返回的ArrayList并不是我们熟悉的java.util.ArrayList,而是另一个类:
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
抽象类AbstractList 定义了一系列比如add()、remove()修改list的方法,然而在这个ArrayList中并没有实现它们,所以返回的ArrayList是不支持修改操作的。
那么如果想要对其进行add或者remove应该怎么做呢?
Integer[] datas = new Integer[]{1,2,3,4,5};
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(datas));
标签:java,Arrays,list,ArrayList,List,datas,Java,asList 来源: https://blog.csdn.net/zl1zl2zl3/article/details/93967748
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。