ArrayList可能是日常開發中使用頻率最高的集合類型之一(另一個是HashMap),但是有些細節不細究、不常回顧的話總是會慢慢模糊,比如有一語句<code>List<Object> objects = new ArrayList<>();</code> ,試問此時<code>objects</code> 的容量(capacity)是多大?
盡管類似這樣的細節對代碼品質的影響可能不大,但作為Java程式員我們還是有必要去熟悉這些細節并挖掘隐含在這些細節背後的設計奧秘。鑒于此,我覺得有必要再次細度Java ArrayList源碼。
首先列舉一下本文所涉及的知識點:
1、ArrayList内部如何實作?适合什麼樣的操作場景?
2、new ArrayList<>()方法調用後所提供的ArrayList容量是多大?
3、未提供容量值,但是調用add方法後ArrayList容量值是多大?
4、ArrayList什麼時候擴容?如何擴容?擴多大?
5、ArrayList是否線程安全?
6、ArrayList如何序列化?
7、ArrayList最大容量是多大?
數組是順序表,這意味着ArrayList不适合在非尾部插入和删除
再來看<code>add</code>方法
<code>ensureCapacityInternal</code>方法
數組實作,适合随機存取、不适合非尾部的增删操作。
至少是10,或者實際需要值(大于10)
目前需要的容量要比目前ArrayList的capacity大時進行擴容;擴容的操作是重新配置設定數組;至少會擴容 1/2 oldCapacity(向下取整),如果newCapacity小于最少需要的容量minCapacity,那将擴大至最少需要容量。
不是,沒有任何synchronized方法。
Integer.MAX_VALUE - 8,部分虛拟機在數組中預留了8位存儲頭部資訊。