每日一问(常用的集合接口和类有哪些【二】)—最常用的集合ArrayList类

本人在曾经的数年编程生涯中,使用的最多的就是ArrayList类了,原因也非常简单。ArrayList类可以是最直接符合集合这一概念的类了,当然这种说法只是我的个人之见。ArrayList可以说是一个最简单元素的汇集,在初始化和赋值的过程中,我们可以不关心各个元素的顺序,可以不关心这些元素直接的关系,例如它们之间的大小等,我们可以只是简单的把元素放到集合里面去。

ArrayList的本质上是数组,从ArrayList类的构造方法可以看出,它所做的工作就是将一个空的对象数组赋值给了类实例的属性elementData.

    public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }

而ArrayList中的设置和访问其中元素的方法实际上主要都是为对elemenData的操作,例如以下的get和set方法

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
    public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

这里值得注意的是,在ArrayList类中有一个属性 DEFAULT_CAPACITY

    private static final int DEFAULT_CAPACITY = 10;

这个值规定了ArrayList在第一次调用add方法时,给对象,实际上是elementData分配的大小,这个值与属性size的意义是完全不同的。在之后调用add方法时,会进行大小的判断,当发现elementData的大小不够时,会进行扩充,执行的方法为grow,从代码中可看出,扩充后的数组大小为原数组大小加上其1/2大小

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
原文地址:https://www.cnblogs.com/oldfish/p/3570513.html