ArrayList常见方法解读(源码,以及对内存使用,gc的影响)

  1. 扩容方法 ensureCapacity, 普通扩容类似只是截取了此方法中的5,6,7步。
    MAX_ARRAY_SIZE = Integer.MAX_VALUE-8;
    Integer.MAX_VALUE = 0x7fffffff;
   /**
     * 对elementData扩容
	 * 1. 原elementData=[], minCapacity<=10,无效操作
	 * 2. 原elementData=[], MAX_ARRAY_SIZE>=minCapacity>10, modCount++, elementData长度改为minCapacity
	 * 3. 原elementData=[], MAX_ARRAY_SIZE<minCapacity, modCount++, elementData长度改为Integer.MAX_VALUE
	 * 原elementData<>[], elementData长度最小是10
	 * 4. 原elementData<>[], minCapacity<=elementData长度, modCount++
	 * 5. 原elementData<>[], (elementData长度 * 1.5)>=minCapacity>elementData长度, modCount++ , elementData长度为(原elementData长度 * 1.5)
	 * 6. 原elementData<>[], MAX_ARRAY_SIZE>=minCapacity>(elementData长度 * 1.5), modCount++ , elementData长度为(原elementData长度 * 1.5)
	 * 7. 原elementData<>[], MAX_ARRAY_SIZE<minCapacity, modCount++ , elementData长度为Integer.MAX_VALUE
     *
     * @param   minCapacity   the desired minimum capacity
     */
    public void ensureCapacity(int minCapacity) {
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            ? 0
            : DEFAULT_CAPACITY;

        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }
  1. System.arraycopy方法
// elementData从下标index至下标size-1复制到index+1至size位置(size - index为数组长度)
System.arraycopy(elementData, index, elementData, index + 1, size - index);
  1. remove方法此处有内存泄露的例子,和在此处的解决办法
    /**
     * 1. elementData从下标index+1至下标size-1复制到index至size-2位置
	 * 2. 此时下标size-1和size-2为相同地址,指向同一对象,size-1置null防止内存泄露(size-2指向别的位置时,size-1还有引用,既无法访问,又是垃圾数据)
     */
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }
  1. fastRemove 不返回删除的对象,防止对象逃逸,增加了效率,所以称为fastRemove
    /*
     * 跳过边界检查,不返回删除的值(避免对象逃逸)
     */
    private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }
  1. 其余部分方法注释见文件
    https://download.csdn.net/download/liha12138/12498570
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值