asList生成的List集合是继承了AbstractList,该类对于add方法,就是抛出一个异常。
注意
(1)该方法适用于对象型数据的数组(String、Integer…)
(2)该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean)
(3)该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新
(4)不支持add()、remove()、clear()等方法
【2.Arrays.asList()是个坑】
用此方法得到的List的长度是不可改变的,
当你向这个List添加或删除一个元素时(例如 list.add(“d”);)程序就会抛出异常
总结
如果你的List只是用来遍历,就用Arrays.asList()。
如果你的List还要添加或删除元素,还是乖乖地new一个java.util.ArrayList,然后一个一个的添加元素。
解决方法
1.可以使用ArrayList类的构造方法将Arrays.asList(1,2,3)对象当做参数传进构造方法中。
2.可以使用JDK1.8中的stream方式实现
方式一
int[] is = {1,2,3};
List<Integer> list1 = Arrays.asList(is);
List<Integer> list = new ArrayList<>(list1);
此时的list就可以正常的增删改了
方式二
int[] is = {1,2,3};
List<Integer> list1 = Arrays.asList(is);
List<Integer> list = list1.stream().collect(Collectors.toList());
此时的list就可以正常的增删改了
代码
package ArrayTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Array9 {
public static void main(String[] args) {
//集合转为数组的2种方式
//可以使用ArrayList类的构造方法将Arrays.asList(1,2,3)对象当做参数传进构造方法中。
//可以使用JDK1.8中的stream方式实现
//方法1
Integer[] arr1 = {1,2,3};
List<Integer> list1 = Arrays.asList(arr1);
//list1只能查询用
System.out.println("list1 = " + list1);
//list1.add(4);//add(),remove()都用不了
//System.out.println("list1 = " + list1);//报错
List<Integer> list2 = new ArrayList<>(list1);
//此时的list2可以正常的增删改了
list2.add(4);
System.out.println("list2 = " + list2);//这次不报错了
System.out.println(list1.contains(4));//false
System.out.println(list2.contains(4));//true
System.out.println();
//方法2
Integer[] arr2 = {7,8,9};
List<Integer> list3 = Arrays.asList(arr2);
//list3只能查询用
System.out.println("list3 = " + list3);
//list3.add(10);
//System.out.println("list3 = " + list3);
List<Integer> list4 = list3.stream().collect(Collectors.toList());
//此时的list4可以正常的增删改了
list4.add(10);
list4.add(10);
list4.add(11);
System.out.println("list4 = " + list4);
}
}