黑龙江省和城乡建设厅网站,手机模板网站模板下载,上海网站建设外包公司,网站备案负责人一定要法人一.Arrays.asList() 返回的list不能add,remove
Arrays.asList()返回的是List,而且是一个定长的List#xff0c;所以不能转换为ArrayList#xff0c;只能转换为AbstractList
原因在于asList()方法返回的是某个数组的列表形式,返回的列表只是数组的另一个视图,而数组本身并没…一.Arrays.asList() 返回的list不能add,remove
Arrays.asList()返回的是List,而且是一个定长的List所以不能转换为ArrayList只能转换为AbstractList
原因在于asList()方法返回的是某个数组的列表形式,返回的列表只是数组的另一个视图,而数组本身并没有消失,对列表的任何操作最终都反映在数组上. 所以不支持remove,add方法的
下面是一段很简单的测试代码
public class MainFacade { public static void main(String[] args) { ListInteger list Arrays.asList(1,2,3); list.add(5); System.out.print(list.toString()); }
}
不过上面的代码会throw出一个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 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接口定义如下
private static class ArrayListE extends AbstractListE implements RandomAccess, java.io.Serializable
我们再来看看AbstractList这个类的定义
public abstract class AbstractListE extends AbstractCollectionE implements ListE
这时我们发现AbstractList这个类的set add remove方法定义如下
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是只读的那么平时我们怎样避免这样的错误发生我们可以采用如下方法
ListInteger list new ArrayList(Arrays.asList(1,2,3));
二、Arrays.asList()陷阱
代码如下
Java代码
public static void main(String[] args) { int[] data {1,2,3,4,5}; List list Arrays.asList(data); System.out.println(列表中的元素数量是 list.size()); } 注意这里输出的数量是1原因是在Arrays.asList中其接收的参数原型其实是泛型变长参数来的而基本类型是不能作为范型的参数按道理应该使用包装类型但这里缺没有报错 因为数组是可以泛型化的所以转换后在list中就有一个类型为int的数组
Java代码 int[] data {1,2,3,4,5}; List list Arrays.asList(data); System.out.println(元素类型 list.get(0).getClass()); System.out.println(前后是否相等data.equals(list.get(0))); 可以看到输出的为元素类型:class [I 因为jvm不可能输出array类型array类型属于java.lang.reflect包通过反射访问 数组的这个类编译时候生成的。所以要改为
Java代码
Integer[] data {1,2,3,4,5};
List list Arrays.asList(data);
System.out.println(列表中的元素数量是 list.size()); 此外假如如下代码
Java代码
//枚举声明一个星期
enum Week{Sun,Mon, Tue, Wed,Thu,Fri,Sat}
public static void main(String[] args) { //工作日 Week[] workDays {Week.Mon, Week.Tue, Week.Wed,Week.Thu,Week.Fri}; //转换为列表 ListWeek list Arrays.asList(workDays); //增加周六也为工作日 list.add(Week.Sat); 注意这里用add会出错因为是arrays.aslist中看代码可以看到这里返回的 ArrayList不是原来的传统意义上的java.util.arraylist了而是自己工具类的一个 静态私有内部类并没有提供add方法要自己实现所以这里是出错了因此 除非确信array.aslist后长度不会增加否则谨慎使用 ListString abcArrays.asList(a,b,c),因为这样的长度是无法再add的了