起因
项目中,遇到如下问题:
data为MiniOrderModel实体类,
List <MiniOrderModel> orderModelList = pager.getData();
orderModelList.add(data);
执行报错:java.lang.unsupportedOperationException at java.util.AbstractList.add
Arrays.asList()
public static <T> List<T> asList(T... a){
return new ArrayList<>(a);
}
输入参数:泛型的变长参数。注:基本类型不能泛型化。
输出参数:固定长度的列表。
官方例子:此方法还提供了一种方便的方法来创建一个固定大小的列表,该列表已初始化为包含多个元素:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
设计初衷是为了生成长度不可变的list,保证数据的安全性。
ArrayList 继承AbstractList。
AbstractList的add方法如下:
public void add(int index,
E element){
throw new unsupportedOperationException();
}
其remove方法如下:
public E remove(int index){
throw new unsupportedOperationException();
}
Arrays内部的ArrayList 继承AbstractList,没有重写add和remove方法,所以会抛出异常。(第一处)
java.util.ArrayList
java.util.ArrayList 继承AbstractList,但重写了add和remove方法。
因此,文章一开始的添加操作应该修改为:
List<MiniOrderModel> orderModelListOri = pager.getData();
List<MiniOrderModel> orderModelList = new ArrayList(orderModelListOri);
orderModelList.add(data);
Arrays.asList()用途
Arrays.asList()常用作循环遍历(第二处),如下:
//Integer
Integer[] array={1,2,4};
List<Integer> list = Arrays.asList(array);
for(Integer l :list){
System.out.println(l);
}
list.set(0,88);
System.out.println(list.get(0));
System.out.println(array[0]);
array[1] = 66;
System.out.println(list.get(1));
System.out.println(array[1]);
//基本类型 int
int[] array1={1,2,4};
List list1 = Arrays.asList(array1);
for(Integer l :list1){
System.out.println(l);
}
list1.set(0,88);
System.out.println(list1.get(0));
System.out.println(array1[0]);
输出结果:
1
2
4
88
88
66
66
[I@1666b41 //输出是一个引用,因为把输入的array1当成一个元素。
java.lang.ArrayStoreException:java.lang.Integer
以上代码说明,针对对象数组类型,使用Arrays.asList()后,数组和列表连接在一起,更新(第三处)其一,另一个也发生更新。
Arrays.asList()的循环遍历,不适用与基本的数据类型(byte,short,long,int,float,double,boolean,char)。
在需要执行add,remove,clear操作时,需要new一个新的java.util.ArrayList。
其他方法
后记补充
最近在学习《码上高效:java开发手册》,手册中讲到这部分知识,故搬运过来,温故而知新。
Arrays类中的ArrayList(第一处详解)
本书将Arrays类中的ArrayList称为李鬼(InnerArrayList)。
数组转集合:
遍历(第二处详解)
Arrays类中的set(第三处)
集合转数组(新知)
说明,集合转数组时,
1.不要用toArray()无参方法将集合转数组,这样会导致泛型丢失。
2.toArray(T[] array),数组array的长度=list.size()最合适。