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