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