为什么Java里的Arrays.asList不能用add和remove方法?
2015-06-07 13:45
681 查看
在平时的开发过程中,我们知道可以将一个Array的对象转化为List。这样的操作,我们只要采用Arrays.asList这个方法就行了。笔者前段时间一直用这个方法,有一天,我发现通过Arrays.asList得到的List无法进行add和remove等操作。
下面是一段很简单的测试代码:
[java] view
plaincopy
public class MainFacade {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3);
list.add(5);
System.out.print(list.toString());
}
}
不过上面的代码会throw出一个UnsupportedOperationException这样的异常
[html] view
plaincopy
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at org.popkit.MainFacade.main(MainFacade.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
终其原因是Arrays.asList方法返回的ArrayList是继承自AbstractList同时实现
了RandomAccess和Serializable接口,定义如下:
[java] view
plaincopy
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
我们再来看看AbstractList这个类的定义:
[java] view
plaincopy
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
这时我们发现AbstractList这个类的set add remove方法定义如下:
[java] view
plaincopy
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
现在知道了它throw UnsupportedOperationException异常的原因了。
通过上面的分析,我们知道,其实通过asList方法得到的List是只读的,那么平时我们怎样避免这样的错误发生?我们可以采用如下方法:
[java] view
plaincopy
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
下面是一段很简单的测试代码:
[java] view
plaincopy
public class MainFacade {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3);
list.add(5);
System.out.print(list.toString());
}
}
不过上面的代码会throw出一个UnsupportedOperationException这样的异常
[html] view
plaincopy
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at org.popkit.MainFacade.main(MainFacade.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
终其原因是Arrays.asList方法返回的ArrayList是继承自AbstractList同时实现
了RandomAccess和Serializable接口,定义如下:
[java] view
plaincopy
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
我们再来看看AbstractList这个类的定义:
[java] view
plaincopy
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
这时我们发现AbstractList这个类的set add remove方法定义如下:
[java] view
plaincopy
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
现在知道了它throw UnsupportedOperationException异常的原因了。
通过上面的分析,我们知道,其实通过asList方法得到的List是只读的,那么平时我们怎样避免这样的错误发生?我们可以采用如下方法:
[java] view
plaincopy
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
相关文章推荐
- 常见的Java的软件包
- SpringMVC 学习笔记(十一) SpirngMVC运行流程
- Eclipse 关联源码 ( src.zip)
- Eclipse 关联中文 api
- java中各种数据类型(非基本类型)的大小比较
- java中 this和super的区别
- struts2总结四:Action与Form表单的交互
- SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver
- java中super()和this()浅析
- 求字符串A与字符串B的最长公共字符串(JAVA)
- Java方法参数的使用情况
- [Eclipse]代码已被写入关于如何切换到unix在新行
- Java知多少(85)文本框和文本区
- RMI介绍
- 关于JAVA回调函数机制
- spring事务配置
- Exception in thread "main" java.lang.NoSuchMethodException: com.anbo.reflect.classinfo.Person.setNam
- Java swing 如何让垂直滚动条始终在最下面
- Spring集成ORM框架之JDBC的使用
- Spring中$Proxy4 cannot be cast to错误