Java集合-ArrayList的擴容機制

ArrayList 的擴容機制

ArrayList 的簡介

底層是基於數組實現的。java

  • 優勢:查找性能優越(支持隨機查找,直接使用數組下標進行查找)
  • 缺點:因爲底層是基於數組進行實現的,在增刪元素中表現很差

這裏須要說明一下,由於 ArrayList 元素增刪涉及增刪元素位置以後的元素移動,極大的影響了性能。
固然這裏提出兩個觀點:算法

  • 第一種狀況:假如增刪元素在 ArrayList 的末尾,這種狀況下和 LinkedList 的性能優越就須要再次討論。
  • 第二種狀況:假如增刪元素在 ArrayList 的中間,咱們要知道,LinkedList 的性能損耗只要體如今元素遍歷上,而 ArrayList 的性能損耗主要體如今複製移動元素上,因此這種狀況下二者的性能優越性還須要再次討論。

ArrayList 的擴容機制

話題來到咱們討論的重點,ArrayList 的擴容機制:
前面咱們說道,ArrayList 的底層是數組,那麼數組的一個特性就是初始化必需要指定大小,那麼隨着元素的不斷增長,如何進行擴容就成爲了一個須要關注的問題。數組

1.預操做:添加元素add()方法

咱們在進行添加 add() 操做以前,會首先判斷 size 的大小,判斷是否能執行add()操做而不報錯。數據結構

public boolean add(E e) {
    ensureCapacityInternal(size + 1);
    elementData[size++] = e;
    return true;
}

先調用 ensureCapacityInternal 方法,傳入 size+1 進去,檢查是否須要擴充 elementData 數組的大小。post

2.進行擴容:grow()

若是肯定須要擴容的話,使用 grow() 方法,newCapacity = 擴充數組爲原來的1.5倍(不能自定義),若是還不夠,就使用它指定要擴充的大小minCapacity,而後判斷minCapacity是否大於MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8) ,若是大於,就取Integer.MAX_VALUE性能

3.元素的複製

在 ArrayList 成功擴充以後,最後一步要進行的是元素的複製,咱們這裏調用的是 ArrayList 下的 arraycopy() 方法。code


部份內容參考自:
1.《數據結構與算法分析:java語言描述》
2.https://juejin.im/post/5d42ab...ci

相關文章
相關標籤/搜索