问题
java中 Arrays
工具类中有asList()
方法,可以用来将对象数组转换为List对象。但是当我们对基本类型的数组使用时会报错。
先放结论
原因:
Arrays.asList()
方法接受的参数为对象数组,当参数是基本类型的数组,会被当做是只有一个元素的对象数组(即该元素是一个基本类型数组),因此报错。
解决方法:
- 第一种方法是:使用基本类型的包装类型,即
Integer
而非int
,Character
而非char
。 - 第二种方法是:将数组内元素逐个加入
add
入List
。
下面演示:
public static void main(String[] args) {
//错误方法:
int[] intarr = new int[2];
List<Integer> intlist= new ArrayList<>();
// 下面语句报错
intlist = Arrays.asList(intarr)
//正确方式1 但是这种方法很奇怪!哪有创建Integer数组的。
Integer[] integerarr new Integer[2];
intlist = Arrays.asList(integerarr);
//正确方式2 手动添加,自动装箱!
int[] intarr = new int[2];
List<Integer> intlist = new ArrayList<Integer>() {
{
// 这里可以添加 内容
for (int i :intarr) { add(i); }
}
};
}
List转Array,list.toArray()
同理并不能只接转换为基本类型,list.toArray()
返回类型为封装后的类型 即Integer ,Character
等。
所以需要先转为封装类型再转为基本类型。
public static void main(String[] args) {
int size =2;
Integer[] integerarr = new Integer[size];
List<Integer> intlist= new ArrayList<>();
int[] intarr = new int[size];
intlist.add(1);
intlist.add(2);
//先转为Integer[]
integerarr = (Integer[]) intlist.toArray(new Integer[size]);
//再逐个放入
for (int i = 0; i < size; i++) {
intarr[i] = integerarr[i];
}
System.out.println(Arrays.toString(intarr));
}
补充内容:
当String数组转 list时候,Arrays.asList()
会转成功,但是这样做之后不能对list进行操作。如果添加或删除列表中的元素,程序会抛出异常UnsupportedOperationException。
正确的方法是:ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));
详见ArrayList数组互转