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