作者:feigeswjtu
GitHub地址:https://github.com/feigeswjtu


ArrayList一些說法

顧名思義,以數組實現。節約空間,但數組有容量限制。超出限制時會增加50%容量,用System.arraycopy()複製到新的數組。因此最好能給出數組大小的預估值。默認第一次插入元素時創建大小爲10的數組。

按數組下標訪問元素-get(i)、set(i, e) 的性能很高,這是數組的基本優勢。 如果按下標插入元素、刪除元素-add(i,e)、 remove(i)、remove(e),則要用System.arraycopy()來複制移動部分受影響的元素,性能就變差了。 越是前面的元素,修改時要移動的元素越多。直接在數組末尾加入元素-常用的add(e),刪除最後一個元素則無影響。

我們先通過一段簡單的代碼來看下內存變化。

ArrayList必知必會

內存變化圖:

ArrayList必知必會

其中,add操作可以理解爲直接將數組的內容置位,remove操作可以理解爲刪除index爲0的節點,並將後面元素移到0處。

ArrayList必知必會

ArrayList的類聲明如下:

ArrayList必知必會

實現了List接口,說明ArrayList是List的一個實現類,實現了RandomAccess(RandomAccess接口說明)說明ArrayList支持隨機訪問。

ArrayList初始化

ArrayList重載了多個構造方法,我們挑兩個介紹一下。

ArrayList必知必會

ArrayList必知必會

ArrayList的add方法

當然我們向ArrayList放入元素時,會使用add方法,這個方法會把元素放在隊尾,源碼如下:

ArrayList必知必會

代碼表面很簡單,但是有一個稍微複雜的ensureCapacityInternal方法,可以看出ensureCapacityInternal方法纔是add的核心,這段代碼就是用來擴容的,代碼如下:

ArrayList必知必會

ArrayList必知必會

ArrayList的get和set方法

get和set操作比較簡單了,就是對下標對應的元素進行set和get操作。

ArrayList必知必會

remove方法

最後介紹一下remove方法:

ArrayList必知必會

ArrayList不是線程安全的

最後說明一下ArrayList不是線程安全的,如果要做到線程安全,需要我們自己對ArrayList進行加鎖操作,或者使用鎖或者使用synchronized,另外還可以用Collections提供的synchronizedList()進行操作,實際上synchronizedList()方法就是使用了synchronized進行併發控制的,只是對我們開發者來說使用起來更方便了。

相關文章