網(wǎng)站建設(shè)常見(jiàn)問(wèn)題及解決辦法廈門(mén)網(wǎng)站建設(shè)
結(jié)論:初始長(zhǎng)度為10,若所需長(zhǎng)度小于1.5倍原長(zhǎng)度,則按照1.5倍擴(kuò)容。若不夠用則按照所需長(zhǎng)度擴(kuò)容。
一. 明確類(lèi)內(nèi)部重要變量含義
? ? ? ? 1:數(shù)組默認(rèn)長(zhǎng)度
? ? ? ? 2:這是一個(gè)共享的空數(shù)組實(shí)例,用于明確創(chuàng)建長(zhǎng)度為0時(shí)的ArrayList ,比如通過(guò) new ArrayList<>(0),ArrayList 內(nèi)部的數(shù)組 elementData 會(huì)指向這個(gè) EMPTY_ELEMENTDATA。因?yàn)樗庆o態(tài)常量,可以共享這個(gè)數(shù)組,避免內(nèi)存浪費(fèi)。
????????3:也是一個(gè)共享的空數(shù)組實(shí)例,用于未指定容量的 ArrayList。當(dāng)你創(chuàng)建一個(gè) ArrayList 但沒(méi)有指定容量,比如 new ArrayList<>()。它和 EMPTY_ELEMENTDATA 不同的地方在于,一旦向 ArrayList 添加第一個(gè)元素,它的容量會(huì)自動(dòng)擴(kuò)展到默認(rèn)10的大小。可以達(dá)到延遲分配的作用。
????????4:elementData 是 ArrayList 的實(shí)際存儲(chǔ)數(shù)組,其中保存著所有的元素。如果 ArrayList 是空的,那么 elementData 會(huì)指向 EMPTY_ELEMENTDATA 或 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,根據(jù)是否指定了容量。
????????5:ArrayList的實(shí)際長(zhǎng)度
二. 初始化方式即elementData指向(源碼)
第 1 種初始化方式,不指定長(zhǎng)度,會(huì)指向默認(rèn)長(zhǎng)度的空數(shù)組。
第 2 種初始化方式,明確指定長(zhǎng)度為0,會(huì)指向空數(shù)組。
3. 通過(guò)add方法來(lái)展示擴(kuò)容過(guò)程
3.1 小于默認(rèn)長(zhǎng)度10的擴(kuò)容
????????如圖所示最后一段是若擴(kuò)容最小長(zhǎng)度小于10或數(shù)組長(zhǎng)度為0,則會(huì)直接擴(kuò)容為默認(rèn)長(zhǎng)度10.
3.2 大于10的擴(kuò)容
????????源碼中賦予新長(zhǎng)度的的兩種增長(zhǎng)方式,圖中標(biāo)出的增長(zhǎng)1與增長(zhǎng)2。
????????增長(zhǎng)1:即為目前數(shù)組最少需要的擴(kuò)容多少
????????增長(zhǎng)2:為原始數(shù)組長(zhǎng)度的0.5倍。(oldCapacity>>1,代表右移位操作,oldCapacity>>1? 等于?oldCapacity/2 等于 oldCapacity*0.5)
????????源碼中是將增長(zhǎng)1和增長(zhǎng)2傳入ArraySupport.newLength函數(shù)中來(lái)獲得合適的新長(zhǎng)度。
????????而ArraySupport.newLength函數(shù)中重要公式如下:
可以看出,若擴(kuò)容0.5個(gè)oldCapacity 比需要的最小容量則按照0.5個(gè)oldCapacity擴(kuò)容,否則按照所需的最小容量進(jìn)行擴(kuò)容。
4.總結(jié):若首次擴(kuò)充長(zhǎng)度不足10的,擴(kuò)充為默認(rèn)最小長(zhǎng)度10。超過(guò)10的按照實(shí)際長(zhǎng)度擴(kuò)容。非首次擴(kuò)容,若擴(kuò)容1.5倍夠用則按照1.5倍擴(kuò)容,不夠用則按照所需的容量擴(kuò)容。
????????補(bǔ)充知識(shí)點(diǎn):為什么擴(kuò)容倍數(shù)是1.5而不是其他倍數(shù)。若倍數(shù)太大,則可能會(huì)導(dǎo)致過(guò)多空間浪費(fèi),若倍數(shù)太小,則會(huì)導(dǎo)致頻繁擴(kuò)容,降低性能。所以選擇1.5倍盡可能不浪費(fèi)過(guò)多空間,也盡可能不會(huì)頻繁擴(kuò)容。