首页 > 其他分享 >ArrayList的构造函数

ArrayList的构造函数

时间:2022-11-09 17:25:10浏览次数:33  
标签:Object 构造方法 ArrayList elementData initialCapacity 构造函数 size

近期针对于项目中的一些关于ArrayList的使用,在对于ArrayList构造方法搞不清楚,所以来写个总结。

直接看构造方法:

无参构造方法

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

注释说:构造一个空的集合,初始值为10.

注意这里所谓的初始容量10,指的是第一次放入元素(add)操作的时候,才会将数组长度指定为10.再次之前是一个空的数组

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

可以看一下为什么是为10的:

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

这里对DEFAULT_CAPACITY的描述:

    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;

有参构造方法

    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }

通过指定的集合来进行构造集合。参数因为是Collection,并没有说明是哪个子类。所以就直接转换成数组,然后利用copy机制来进行拷贝转换操作。

先获取得到长度赋值给size,然后判断是否是ArrayList集合

重点:这里会将size来进行赋值!!!!!!

size = a.length

所以可以直接进行for循环。但是下面这个就不可以了。

有参构造方法二

    /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

可以看到这里和上面的区别!

这里是直接创建了一个数组,但是没有给size来进行赋值!

说明了使用for循环的时候,是无法来进行遍历的。虽然数组是有长度的,但是遍历的时候需要使用到size来进行操作。

标签:Object,构造方法,ArrayList,elementData,initialCapacity,构造函数,size
From: https://www.cnblogs.com/likeguang/p/16874473.html

相关文章