1. 程式人生 > >扒一扒系列之開發中常用的Java集合類(ArrayList篇 jdk 1.7)

扒一扒系列之開發中常用的Java集合類(ArrayList篇 jdk 1.7)

mda des obj 初始設置 onu util private 內部 會有

關於這個系列,因為開發主要用的是java語言,一直想寫寫java開發中常用的一些類(雖然這才是開始的第三篇>_<),所有就起了“扒一扒”系列。這個系列會有框架,或者其他學到的東西。文章盡量做到簡潔,用少的篇幅理順相關的知識點和使用方法。廢話少說,接下來扒一扒ArrayList這個集合類。

一、數據結構

讓我們先看下ArrayList所在包的位置,在java.util.ArrayList中(如圖1-1),它在jdk中的util中,說明它在開發中比較常用。從它的名字能看出數據結構為一個數組,看一下這個類的私有屬性。

private transient Object[] elementData;//註意transient的意思,以及是否能夠進行序列化。

從上面的代碼可以印證,它的內部結構為數組。

技術分享圖片

圖1-1

技術分享圖片

圖上為ArrayList的繼承關系圖

二、常用方法

先說一下,如果要操作list,一定要確保類已經實例化,或者方法參數傳進來的不為null,否則會造成NPE異常。可以用collectionutils工具做判空驗證。

1、boolean add(E e)

2、get(int index)

3、Iterator<E> iterator()

4、size()

三、源碼主要關註點

由於底層的數據結構是數組,被初始化的時候不能更改,當調用add方法的時候會進行判斷是否數組容量可用,如果不滿足會進行擴容。主要的擴容代碼為:

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    
// overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } /** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }

主要的邏輯,當調用add方法的時候會判斷是否是初始擴容,如果是就進行初始設置,之後每次增加會判斷是否需要擴容,每次擴容為原來的1.5倍。

ArrayList是線程不安全的(不懂什麽是線程安全可以google下*—*),當多個線程操作時會發生錯誤。不能循環for遍歷的時候邊刪除,這會拋modexception異常。需要線程安全的list可以去看下,Java .util.concurrent包下的類。

源碼中有的方法經常用到System.arrayCoy這個方法,這是一個native方法,屬於一個底層方法。

希望這篇文章能夠幫到你,如果您感興趣請看jdk源碼。那會增加你的技能點。

扒一扒系列之開發中常用的Java集合類(ArrayList篇 jdk 1.7)