集合-ArrayList
一、ArrayList的注意事項:
1)ArrayList可以放任何元素,包括空值,可以加入多個空值。
2)ArrayList是由數組來實現數據存儲的
3)ArrayList基本等同于Vector,除lArrayList是線程不安全(執行效率高),在多線程情況下,不建議使用ArrayList
沒有synchronized進行修飾
二、ArrayList 的底層操作機制源碼分析(重點,難點)
- ArrayList 中維護了一個 Object類型的數組 elementData。 transient Object[]
elementData; // transient 標識瞬間,短暫的,表示該屬性不會被序列化 - 當創建ArrayList對象時,如果使用的是無參構造器,則初始elementData
容量為0,第一次添加,則擴容elementData為10,如需再次擴容,則擴容elementData為1.5倍。 - 如果使用的是指定大小的構造器,則初始elementData容量為指定大小,如果需要擴容,則直接擴容elementData為1.5倍。
- 在 ArrayList list = new ArrayList(); 處添加斷點
- debug – step Into 到 ArrayList.java的ArrarList()構造方法
- 使用無參構造器
- 查詢DEFAULTCAPACITY_EMPTY_ELEMENTDATA可發現 默認為空數組
然后執行 list 的boolean add(E e)方法
先確定是否要擴容,
然后再執行 賦值
在boolean add(E e)方法中,先執行ensureCapacityInternal(size + 1)方法確定是否要擴容,然后再執行賦值。
private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}在calculateCapacity()方法中 先確定elementData是否為空數組,如果為空數組,返回DEFAULT_CAPACITY(默認為10) 和 minCapacity(第一次為1) 中的最大值,
private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}在ensureExplicitCapacity(int minCapacity)方法中確定是否真的擴容
modCount++ :記錄集合修改次數
如果elementData大小不夠,則調用grow()進行擴容
minCapacity - elementData.length > 0 :如果數組所需最小容量 - 數組當前實際大小 大于 0 則執行擴容
private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}grow()方法執行擴容
- 將elementData.length 記錄到 oldCapacity中,第一次值為0 newCapacity = oldCapacity
- (oldCapacity >> 1); 執行擴容,擴容大小為 數組當前容量+數組當前大小右移1位(除以2),即擴容1.5倍
- 因為第一次擴容oldCapacity 為0 所有newCapacity 也為0,執行 if (newCapacity -
minCapacity < 0) newCapacity = minCapacity; 此時newCapacity 為
10,所以第一次擴容大小為 10 - elementData = Arrays.copyOf(elementData, newCapacity);
Arrays.copyOf()方法可保留原先數據擴容 執行Arrays.copyOf()方法進行擴容,第一次執行完elementData
中有10個空數據
擴容完成后,繼續執行add()方法,將數據添加到elementData數組中
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的集合-ArrayList的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer-week1
- 下一篇: 心脏为什么长在左边?原来是因为这个消失的