ArrayList和数组的相互转化

我们都知道,Collection接口的子接口List,有两个实现类,ArrayList和LinkedList,而以数组作为数据结构的集合是哪一个呢?答案当然是ArrayList喽,本篇我们来探讨一个问题,就是ArrayList和数组的互转问题。
1、数组转集合。
在操作数组的工具类Arrays中,有个静态方法如下:

Arrays.asList(T... a);

返回由指定数组支持的固定大小的列表。
来一段代码测试一下:

String[] array = new String[3];
array[0] = "zhangsan";
array[1] = "lisi";
array[2] = "wangwu";
//数组转集合的操作
List<String> list = Arrays.asList(array);

哇,看起来真的简单,然后,咋们就开始各种“疯狂”的操作,

//按照索引取出该位置的值
System.out.println(list.get(0));
//添加元素
list.add(3,"zhaoliu");
//删除元素
list.remove(1);
//打印集合中的元素
System.out.println(list);

运行一下呗,期待控制台输出心里想好的结果。。。。

zhangsan
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at Test.main(Test.java:64)

what??? 我反复检查代码,这么简单的代码都会写错,不会吧,没什么错啊(其实有点过了,但是刚开始确实有点不理解,嘿嘿),况且这个异常UnsupportedOperationException类之前也没遇到过啊。。。。。。
究竟怎么一回事呢,让我们来看看,一怒之下,点开了asList方法的源代码,显示如下:

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

不也是返回一个ArrayList吗?但是仔细一看,你会发现,java.util.ArrayList类也没有个参数为数组的构造器啊,然后我再点进去看这个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) {
            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;
        }

        @Override
        public E get(int index) {
            return a[index];
        }

        @Override
        public E set(int index, E element) {
            E oldValue = a[index];
            a[index] = element;
            return oldValue;
        }
    }

这个类居然是Arrays类的静态内部类,还可以发现,里面根本就没有像我们操作java.util.ArrayList类里面的add(),remove()等的方法,只有get(),set()等方法,是不是有点豁然开朗的感觉,看到阿里巴巴出的那本《码出高效》中对类的形容:李鬼,再形象不过了,此ArrayList非彼ArrayList,哈哈哈,但是还有点不明白的是,这个异常UnsupportedOperationException从哪儿抛出啊,此“李鬼”类继承自AbstractList,点开发现:

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

原来如此啊,看来不能瞎操作啊!!!
但是你可以这么玩:

List<String> lists = new ArrayList<>(Arrays.asList(array));
lists.add("heisi");
System.out.println(lists);

这样就可以操作了。哇,不敲不知道,一敲吓一跳啊。
2、集合转数组
这么转就可以了:

String[] arr = new String[lists.size()];
arr = lists.toArray(arr);
System.out.println(arr.length);

你可能感兴趣的:(笔记)