添加元素
擴(kuò)容
構(gòu)造ArrayList的時(shí)候,默認(rèn)底層數(shù)組大小是10
public ArrayList(){
this(10);
}
ArrayList是基于動態(tài)數(shù)組實(shí)現(xiàn)的,底層數(shù)組不夠就進(jìn)行擴(kuò)容即舌,ensureCapacity擴(kuò)容的時(shí)候把數(shù)組大小先乘以3麻昼,再除以2,最后加1
如果一次擴(kuò)容得太大抬探,必然造成內(nèi)存空間浪費(fèi)絮供,如果一次擴(kuò)容的不夠那下一次擴(kuò)容的操作會比較快到來关筒,降低程序運(yùn)行的效率
刪除元素
ArrayList支持兩種刪除方式
- 按照下標(biāo)刪除
- 按照元素刪除
把指定元素后面位置的所有元素,利用System,arraycopy方法整體向前移動一個(gè)位置
最后一個(gè)位置的元素指定為NULL杯缺,這樣gc可以回收它
插入元素
插入的時(shí)候,按照指定位置睡榆,把從指定位置開始的所有元素利用System.arraycopy方法做一個(gè)整體的復(fù)制萍肆,向后移動一個(gè)位置,向后移動一個(gè)位置
ArrayList的優(yōu)缺點(diǎn)
- ArrayList 底層以數(shù)組實(shí)現(xiàn)胀屿,是一種隨機(jī)訪問模式塘揣,再加上它實(shí)現(xiàn)了RandomAccess接口,因此查找時(shí)非乘拚福快
- ArrayList在順序添加一個(gè)元素的時(shí)候非常方便亲铡,只是往數(shù)組里面添加了一個(gè)元素而已
- 在刪除,插入元素的時(shí)候葡兑,涉及到一次元素復(fù)制奖蔓,如果復(fù)制的元素很多,那么就會比較耗費(fèi)性能
ArrayList與Vector的區(qū)別
ArrayList 是非線程安全的讹堤,因?yàn)锳rrayList中所有的方法都不是同步的吆鹤,在并發(fā)下一定會出現(xiàn)線程安全問題
變成一個(gè)線程安全的List
List<String> synchronizedList = Collections.synchronizedList(list);
synchronizedList.add("hhh");
或者用vector
vector可以指定增長因子,如果指定了洲守,那么擴(kuò)容的時(shí)候會每次新的數(shù)組大小會在原數(shù)組的大小基礎(chǔ)上加上增長因子疑务,如果不指定增長因子,那么就給原數(shù)組大小*2