集合中ArrayList,一直認(rèn)為,擴(kuò)容的話,就是從新建了一個(gè)對象,然后把新對象的引用重新賦給當(dāng)前對象,最近想想不對。
1、ArrayList:對象中有兩個(gè)變量
transientObject[] elementData; 用來存儲數(shù)據(jù) 和private int size;用來記錄當(dāng)前數(shù)組長度
2、當(dāng)我們new ArrayList()的時(shí)候,這時(shí)我們在內(nèi)存中開辟了一塊ArrayList()的內(nèi)存空間,注意,這里不是Array的內(nèi)存空間,本身ArrayList是沒有任何意義的,有意義的是他的elementData這個(gè)變量
3、當(dāng)觸發(fā)擴(kuò)容的時(shí)候,最后是通過System.arraycopy的方式去拷貝數(shù)組的,就是說聲明一個(gè)更大的數(shù)組,然后把老數(shù)組的元素拷貝到這個(gè)新數(shù)組中然后實(shí)現(xiàn)擴(kuò)容
4、擴(kuò)容時(shí)這里的elementData的內(nèi)存地址必然會發(fā)生改變(其實(shí)我也不太確定)
5、所以,ArrayList()這個(gè)內(nèi)存地址是不會改變的,但是他的內(nèi)部的elementData是改變的