代码示例:
public class ArrayDemo { public static void main(String[] args) { Integer[] arr = {1, 2, 3, 4, 5}; //数组转list List<Integer> list = Arrays.asList(arr); System.out.println(list); //list.add(6); //System.out.println(list); List<Integer> list1 = new ArrayList(Arrays.asList(arr)); list1.add(6); System.out.println(list1); //list转数组 //Integer[] arr1 = (Integer[]) list1.toArray(); //System.out.println(Arrays.toString(arr1)); Integer[] arr2 = list1.toArray(new Integer[0]); System.out.println(Arrays.toString(arr2)); } }
(1)当使用 Arrays.asList(arr)来将数组转换为list 时,转换过的list 如果进行add 或者remove 操作会报错:
Exception in thread "main" java.lang.UnsupportedOperationException 我们可以看下asList的源码:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { a = Objects.requireNonNull(array); } @Override public int size() { return a.length; } @Override public Object[] toArray() { return a.clone(); } @Override @SuppressWarnings("unchecked") public <T> T[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size,(Class<? extends T[]>) a.getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return a; }
由asList 的源码可以看出 返回的ArrayLIst 是静态内部类中的维护的构造函数,可以看出定义的构造函数中数组是final修饰的 ,因此通过Arrays.asList(arr) 创建的list 是不可变的,在进行新增或者删除元素的时候报错,这个问题解决需要添加出一层new ArrayList 包裹转换。
(2)list转数组的时候 如果使用list.toArray()的无参构造方法会报错:Exception in thread "main" java.lang.ClassCastException; 该方法返回的是Object[]数组 ,若是 转型为其他类型数组会出现异常。
解决办法使用 toArray的带参方法;