java list 数组 转换

说明

平常经常会用到数组、list的相互转换,但一直没有认证研究,尤其为什么Arrays.asList返回的list不能增加、删除元素,今天彻底搞懂了。

数组转list

Arrays.asList(T… a)

数组转list,使用Arrays.asList(T… a)方法

    //数组转list
    String[] players={"kobe","t-mac","cp3"};
    //Arrays.asList返回的list是固定大小的,不能add、remove操作
    List<String> noList = Arrays.asList(players);

注意,Arrays.asLit()返回的list是固定大小的,不能执行增加、删除操作。所以通常的做法是

List<String> yesList=  new ArrayList<String>(Arrays.asList(players));

Arrays.asList返回的list为什么不能增加、删除元素?

查看源码

Arrays.java
public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

这里用到了ArrayList,不可思议了,因为Arraylist是可以增加、删除元素的呀!为什么这里却不能?继续查看源码发现这里的ArrayList原来是Arrays的内部类ArrayList,而不是java.util.ArrayList

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) {
            if (array==null)
                throw new NullPointerException();
            a = array;
        }
      }

Arrays$ArrayList继承自AbstractList,AbstractList的add、remove方法都抛出异常,所以不能增加、删除元素。另外,构造方法中a=array,说明,数组转换出来的list与数组,指向同一块内存。

public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
 public E remove(int index) {
        throw new UnsupportedOperationException();
    }

list转数组

list.toArray(T[] a)

        //list转数组
        List<String> list2 = new ArrayList<String>();
        list2.add("kobe");
        list2.add("t-mac");
        list2.add("cp3");
        String[] arr2 = list2.toArray(new String[list2.size()]);

你可能感兴趣的:(java list 数组 转换)