• Java基础——List篇 ArrayList (1)ArrayList简介(构造方法;扩容;大小)


     (1)ArrayList简介(构造方法;扩容;大小)

    概念:ArrayList是比较常用的集合类。它实现了List接口,而它的底层是由数组实现的。虽然不是线程安全的,但增加删除元素的处理速度相对较快,在不需要多线程的情况下还是很有效的。

    ArrayList的初始化:当初始化ArrayList时,与之相关的成员变量有以下几个:

    /**
         * 默认的初始扩容步长,如果创建ArrayList的时候未指定扩容的步长或者指定步长<10,则采用10为初始的扩容步长
         */
        private static final int DEFAULT_CAPACITY = 10;
    
        /**
         * 空的elementData数组
         */
        private static final Object[] EMPTY_ELEMENTDATA = {};
    
        /**
         * 和EMPTY_ELEMENTDATA类似,不同之处在于用DEFAULTCAPACITY_EMPTY_ELEMENTDATA
         * 则加入第一个元素时,以步长为DEFAULT_CAPACITY进行扩容
         */
        private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    
        /**
         * 存储ArrayList中元素的缓存数组(ArrayList底层由数组实现)
         * 数组长度(length)即ArrayList的容量(capacity; size)
         * 用new ArrayList()构造方法创建的对象 == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
         * 当添加第一个元素时,会用步长为 DEFAULT_CAPACITY 进行扩容
         */
        transient Object[] elementData; 
    
        /**
         * ArrayList中元素的个数
         * @serial
         */
        private int size;

    构造方法:创建ArrayList对象时,常用的两种方法:

    1. new ArrayList()  不加任何参数。此时ArrayList中不包含任何元素,size()为0。

    2. new ArrayList(int initialCapacity)   参数为初始的扩容步长,指定添加第一个元素时的扩容步长DEFAULT_CAPACITY。此时ArrayList中不包含任何元素,size()为0。

    扩容:当向ArrayList中添加元素,而ArrayList的容量(size)又已满时,需要扩容。

    扩容机制主要用到的方法是:

    1. ensureCapacityInternal方法  判断是否需要扩容(委托给ensureExplicitCapacity方法)

    private void ensureCapacityInternal(int minCapacity) {
            ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
        }

    2. calculateCapacity方法  计算最小容量minCapacity。如果minCapacity<=10或ArrayList为空,都用DEFAULT_CAPACITY作为minCapacity

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            }
            return minCapacity;
        }

    3. grow方法  扩容的实现方法

    private void grow(int minCapacity) {
            /*原有数组容量*/
            int oldCapacity = elementData.length;
            /*新的数组容量,相当于newCapacity = oldCapacity * 1.5 向下取整*/
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            /*将原有ArrayList的元素全部拷贝到一个新的ArrayList中*/
            elementData = Arrays.copyOf(elementData, newCapacity);
        }

    ArrayList的大小:.size()

    刚开始创建ArrayList对象时,size为0;之后每添加一个元素,size+1

    需要注意的是,可以向ArrayList中添加空串"",或者null(因为添加的是Object[] elementData),此时size仍然会增加。

    参考:https://blog.csdn.net/qq_35358091/article/details/102522476

    https://www.cnblogs.com/zhexuejun/p/11149406.html

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    ddd
  • 原文地址:https://www.cnblogs.com/cjh-1023/p/13081746.html
Copyright © 2020-2023  润新知