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