ArrayList是一種基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的List接口,它可以根據(jù)需要?jiǎng)討B(tài)地增長(zhǎng)容量。當(dāng)需要往ArrayList中添加元素時(shí),如果當(dāng)前容量不足,則會(huì)進(jìn)行擴(kuò)容操作。
ArrayList的擴(kuò)容機(jī)制如下:
初始化時(shí),ArrayList默認(rèn)容量為10,當(dāng)需要添加元素時(shí),先判斷當(dāng)前元素個(gè)數(shù)是否達(dá)到容量上限,如果沒(méi)有達(dá)到,則直接添加元素。
如果當(dāng)前元素個(gè)數(shù)已經(jīng)達(dá)到容量上限,則進(jìn)行擴(kuò)容操作。擴(kuò)容操作會(huì)新建一個(gè)容量為原來(lái)的1.5倍的數(shù)組,然后將原數(shù)組中的元素復(fù)制到新數(shù)組中。
對(duì)于大量元素的添加,擴(kuò)容會(huì)成為瓶頸,因?yàn)樗枰獙⒃瓟?shù)組中的元素復(fù)制到新數(shù)組中,這個(gè)過(guò)程需要一定的時(shí)間。
需要注意的是,在多線程環(huán)境中,ArrayList是非線程安全的,因?yàn)槎鄠€(gè)線程可能同時(shí)對(duì)同一個(gè)ArrayList進(jìn)行修改,這時(shí)候需要使用線程安全的List實(shí)現(xiàn),如CopyOnWriteArrayList。