ArrayList源码分析(五)

## ArrayList源码分析()
/**
     * 获取当前集合中有效元素个数
     *
     * @return 有效元素个数
     */
    public int size() {
        return size;
    }

    /**
     * 获取当前集合的子集合,截取范围是start <= n < end
     *
     * @param start start <= end 不得小于0
     * @param end end >= start 不得小于等于size
     * @return 截取得到的一个MyArrayList子集合对象
     */
    public ArrayList<E> subList(int start, int end) {
        if (start > end || start < 0 || end > size) {
            throw new ArrayIndexOutOfBoundsException();
        }

        ArrayList<E> listTemp = new ArrayList<>(end - start);

        for (int i = start; i < end; i++) {
            listTemp.add(this.get(i));
        }

        return listTemp;
    }



    /*
     * 这里需要类内使用的可以用于判断当前容量是否满足添加要求的方法
     * 如果满足直接进入添加模式,如果不满足,需要执行grow方法,完成
     * 底层数组的扩容问题。
     */
    /**
     * 每一次添加元素,都需要进行容量判断,如果满足可以进行添加操作
     * 不满足需要制定grow方法。
     *
     * @param minCapacity 要去的最小容量判断
     */
    private void ensureCapacity(int minCapacity) {
        // 为了节约时间和空间,这里暂不考虑等于情况
        if (minCapacity > elements.length) {
            // 完成一个底层数组的扩容方法
            grow(minCapacity);
        }
    }

    /**
     * 底层数组的扩容方法,原理是创建新数组,移植数组,保存新数组地址
     *
     * @param minCapacity
     */
    private void grow(int minCapacity) {
        // 1. 获取原数组容量
        int oldCapacity = elements.length;

        // 2. 计算得到新数组容量
        int newCapacity= oldCapacity + (oldCapacity >> 1);

        // 3. 判断新数组容量是否满足要求
        if (newCapacity < minCapacity) {
            newCapacity = minCapacity;
        }
        // 新数组容量大于允许的最大数组容量
        if (newCapacity > MAX_ARRAY_SIZE) {
            // 二次判断minCapacity是否小于MAX_APPAY_SIZE
            if (minCapacity < MAX_ARRAY_SIZE) {
                // 最小要求是不大于MAX_ARRAY_SIZE,代码可以运行
                newCapacity = minCapacity;
            } else {
                throw new OutOfMemoryError("Overflow MAX_ARRAY_SIZE");
            }

        }

        //
        /*
         * 4.使用数组工具类方法完成操作
         * Arrays.copyOf(源数据数组,可以是任意数组,采用泛型约束,指定的新数组容量);
         *      a. 根据指定的新数组容量创建对应泛型数据类型的新数组
         *      b. 从源数组中拷贝内容到新数组
         *      c. 返回新数组首地址
         */
        elements = Arrays.copyOf(elements, newCapacity);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值