Java|ArrayList源碼分析|add()增長方法和grow()擴容方法

本文結構:
1.介紹特色
2.基本方法
3.重點源碼分析java

1.介紹特色

ArrayList:
是List的一個具體實現子類,是List接口的一個數組實現 (裏面一定維護了一個數組)。
默認初始容量10, 擴容機制1.5倍。(數組必然有初始容量和擴容機制)
有序。
容許null元素。
容許重複元素。
線程不安全。數組

2.基本方法

關鍵字 簡介
add 增長
contains 判斷是否存在
get 獲取指定位置的對象
indexOf 獲取對象所處的位置
remove 刪除
set 替換
size 獲取大小
toArray 轉換爲數組
addAll 把另外一個容器全部對象都加進來
clear 清空

3.重點源碼分析

源碼解析:安全

public class MyArrayList<E>{

    private static final int DEFAULT_CAPACITY = 10;// 默認容量
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;// 最大容量

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={} ;//空數組


    private Object[] elements;//底層維護的數組
    private int size;//容器內對象的個數
    private int modCount;//記錄ArrayList這個對象被修改的次數
    //構造方法
    public MyArrayList(Object[] elements) {
        this.elements = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }


    /**
     *增長內容
     * @param e
     * @return
     */
    public boolean add(E e) {
        //若是未建立則建立一個默認爲10的數組,若小則擴容

        int minCapacity=size+1;
           //查看容量是否夠(不夠則擴容),或者數組是否還未建立
        ensureCapacityInternal(minCapacity);
        //確保容量夠,則添加數據,並將數據大小加1.
        elements[size]=e;
        size++;
        return true;
    }

    //該方法來確保數組的容量夠用,若還未建立數組則建立數組並賦予默認值。
    private void ensureCapacityInternal(int minCapacity) {
        //若數組爲空(還未添加數據)
        if (elements==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
            //則選出默認值和最小容量的最大值
            minCapacity=Math.max(DEFAULT_CAPACITY,minCapacity);
            //只add方法其實不必比較,主要是addAll()這個方法須要比較
        }

        modCount++;//修改次數加一

        //判斷一下是否須要擴容,若數據+1大於當前數組,則須要擴容
        if(minCapacity-elements.length>0){
            grow(minCapacity);//調用擴容方法
        }
    }

    //擴容具體方法
    private void grow(int minCapacity){
        int oldCapacity=elements.length;//獲取原始數組的長度
        int newCapacity=oldCapacity+(oldCapacity>>1);//擴容 1+0.5 倍
        //若擴容後的長度比所須要的最低長度還要小,則直接把擴容的長度更改成最低所需長度
        if (newCapacity-minCapacity<0){
            newCapacity=minCapacity;
        }
        //若擴容完的新長度比規定的最大容量還大,則要進一步判斷,並進一步修改數組大小
        if (newCapacity-MAX_ARRAY_SIZE>0){
            //若所需的容量居然小於0,說明超過Int最大值,越界了,拋出異常
           if (minCapacity<0){
               throw new OutOfMemoryError();
           }
           //若所需的容量不超過Int最大值,則再判斷
            if (minCapacity>MAX_ARRAY_SIZE){//若所需的大於數組要求的而小於Int最大值
                newCapacity=Integer.MAX_VALUE;//直接賦值Int最大值
            }else{//不然只有小於數組最大值這一種狀況了,賦予數組最大值便可
                newCapacity=MAX_ARRAY_SIZE;
            }
        }

    }
}
相關文章
相關標籤/搜索