list.toArray原理解析

看下面代码输出

        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        Object[] as1 = new Object[5];
        as1[3] = "haha";
        as1[4] = "lala";
        list.toArray(as1);
        System.out.println(Arrays.asList(as1));

        Object[] as2 = new Object[2];
        list.toArray(as2);
        System.out.println(Arrays.asList(as2));

        Object[] as3 = new Object[3];
        list.toArray(as3);
        System.out.println(Arrays.asList(as3));

输出结果为:
list.toArray原理解析_第1张图片

List的toArray方法实现一共有两种,一种是无参方法,一种是泛型数组参数。
1.无参方法直接复制了list数据的数组数据。

    public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }

2.带参方法有三种处理
第一种:当数组大小小于list长度的时候,直接进行数组复制。
第二种:当数组大小大于等于list长度的时候,进行赋值操作。
第三种:当数组大小大于list长度的时候,将list最大长度数组设置为null。(感觉没什么逻辑意义)

    public  T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

3.经过百万级数据性能测试:
当数组大小小于集合长度的时候:12.317152ms
当数组大小等于集合长度的时候:9.327377ms
当数据大小为集合长度两倍的时候:13.547622ms

4.总结:数组大小设置不当的时候,不仅回降低性能,还会浪费空间,
当不需要获取新数组的时候,尽量避免数组长度小于集合长度的情况发生,同时尽可能使用带参方法。

你可能感兴趣的:(算法)