ArrayList扩容机制。


    
    1)直接new 一个ArrayList对象时(未指定初始容量大小)是一个空的数组,容量大小为零。
    
    
    public ArrayList() {
        // DEFAULTCAPACITY_EMPTY_ELEMENTDATA 变量为一个空的数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    
    2)、当第一次调用ArrayList对象的add方法时,分配容量大小
    public boolean add(E e) {
        // size 为ArrayList的实际数量大小而非容量大小,如果未指定容量构建的ArrayList对象此时size对象应该为0
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    
    private void ensureCapacityInternal(int minCapacity) {
        // 如果为空数组,最小需要容量为默认最小容量DEFAULT_CAPACITY 也就是10 private static final int DEFAULT_CAPACITY = 10;
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        // 调用扩容方法
        ensureExplicitCapacity(minCapacity);
    }
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        // 如果最小的需要容量大于此时的容量,调用真正的扩容方法
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        // 第一次扩容1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        // 还是比需要的容量小就把需要的容量作为新的容量值
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        // 如果此时的新的容量比最大容量还大则比较需求容量和数组最大容量的大小,
        如果比最大容量大就赋值为整数最大值,反之赋值为最大容量。
        这里主要防止1.5倍扩容导致新容量值超过数组最大容量
        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);
        
    }
    
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值