扒一扒系列之開發中常用的Java集合類(ArrayList篇 jdk 1.7)
關於這個系列,因為開發主要用的是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)