java ArrayList原理与应用

ArrayList 特有的方法(一般也是用的其父类List的方法):
ensureCapacity(int minCapacity) //初始化容量
trimToSize()  //清除剩余容量
笔试题目:

使用ArrayList无参的构造函数创建一个 对象时, 默认的容量是多少? 如果长度不够使用时又自增增长多少?

    ArrayList底层是维护了一个Object数组实现 的,使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍。
原理剖析:
私有变量:
    private transient Object[] elementData;//维护的Object数组
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//ArrayList最大容量
构造方法:
    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0) //容量小于0抛出异常
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];//创建对应容量数组
    }

    public ArrayList() {
        this(10);  //默认容量10
    }

添加数据方法:
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

    private void ensureCapacityInternal(int minCapacity) {
        modCount++;
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
  /*如果最小需求容量 - 当前空间容量 > 0 代表"当前容量不够"*/

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//a >> n =a / 2^n
        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);
    }
    /*newCapacity = oldCapacity + oldCapacity/2
    如果newCapacity还是小于oldCapacity,那么新容量就用oldCapacity
    如果newCapacity大于了最大容量,那么就会进行大容量处理*/

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容