导读热词
asList和ArrayList不得不说的故事
简介
提到集合类,ArrayList应该是用到的非常多的类了。这里的ArrayList是java.util.ArrayList,通常我们怎么创建ArrayList呢?
创建ArrayList
看下下面的例子:
List names = new ArrayList<>();
上面的方法创建了一个ArrayList,如果我们需要向其中添加元素的话,需要再调用add方法。
通常我们会使用一种更加简洁的办法来创建List:
@Test
public void testAsList(){
List names = Arrays.asList("alice","bob","jack");
names.add("mark");
}
看下asList方法的定义:
public static List asList(T... a) {
return new ArrayList<>(a);
}
很好,使用Arrays.asList,我们可以方便的创建ArrayList。
运行下上面的例子,奇怪的事情发生了,上面的例子居然抛出了UnsupportedOperationException异常。
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.flydean.AsListUsage.testAsList(AsListUsage.java:18)
UnsupportedOperationException
先讲一下这个异常,UnsupportedOperationException是一个运行时异常,通常用在某些类中并没有实现接口的某些方法。
为什么上面的ArrayList调用add方法会抛异常呢?
asList
我们再来详细的看一下Arrays.asList方法中返回的ArrayList:
private static class ArrayList extends AbstractList
implements RandomAccess,java.io.Serializable
可以看到,Arrays.asList返回的ArrayList是Arrays类中的一个内部类,并不是java.util.ArrayList。
这个类继承自AbstractList,在AbstractList中add方法是这样定义的:
public void add(int index,E element) {
throw new UnsupportedOperationException();
}
好了,我们的问题得到了解决。
转换
我们使用Arrays.asList得到ArrayList之后,能不能将其转换成为java.util.ArrayList呢?答案是肯定的。
我们看下下面的例子:
@Test
public void testList(){
List names = new ArrayList<>(Arrays.asList("alice","jack"));
names.add("mark");
}
上面的例子可以正常执行。
总结
在java中有很多同样名字的类,我们需要弄清楚他们到底是什么,不要混淆了。
欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
相关文章
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250