Arrays.asList缺陷
在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷。
基本数据类型无法泛型化
问题如下:
package com.example.demo;
import java.util.Arrays;
import java.util.List;
public class AsList {
public static void main(String[] args) {
int[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
System.out.println(list.size());
}
}
理想结果:5
实际结果:1
原因
该段为asList进入后源码,泛型T,而int是基本数据类型是不能泛型化得所以把数组当作一个整体对象来,那么经过asList转换就只有一个int 的列表了。
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
解决方案
使用Integer对象即可
asList产生的列表不可操作
问题如下
package com.example.demo;
import java.util.Arrays;
import java.util.List;
public class AsList {
public static void main(String[] args) {
int[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
list.add(6);
}
}
发送异常:java.lang.UnsupportedOperationException
原因
源码可知此ArrayList不是java.util.ArrayList,他是Arrays的内部类。该内部类提供了size、toArray、get、set、indexOf、contains方法,而像add、remove等改变list结果的方法从AbstractList父类继承过来,而AbstractList中add直接抛出了异常。
``
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
}
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
public boolean add(E e) {
add(size(), e);
return true;
}
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
解决方案
package com.example.demo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class AsList {
public static void main(String[] args) {
Integer[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
//转
List<Integer> listNew = new ArrayList(list);
//取
Integer[] integers = listNew.toArray(new Integer[]{});
for (int i = 0; i< integers.length; i++){
System.out.println(integers[i]);
}
}
}