zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    String和enum的互相转换
    LeetCode: Sort Colors
    LeetCode: Subsets II
    LeetCode: Spiral Matrix II
    LeetCode: Subsets
    LeetCode: Sum Root to Leaf Numbers
    LeetCode: Sqrt(x)
    LeetCode: Sudoku Solver
    LeetCode: Spiral Matrix
    LeetCode: Substring with Concatenation of All Words
  • 原文地址:https://www.cnblogs.com/cjh-1023/p/13081746.html
Copyright © 2011-2022 走看看