1. 程式人生 > >Java集合類初始容量、加載因子、擴容增量

Java集合類初始容量、加載因子、擴容增量

動態分配內存 數組 線程不安全 可見 LV 加載因子 集合類 一個 arraylist

  當底層實現涉及到擴容時,容器或重新分配一段更大的連續內存(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配內存),要將容器原來的數據全部復制到新的內存上,這無疑使效率大大降低。

  加載因子的系數小於等於1,意指 即當 元素個數 超過 容量長度*加載因子的系數 時,進行擴容。

  另外,擴容也是有默認的倍數的,不同的容器擴容情況不同。

  List 元素是有序的、可重復

  ArrayList、Vector默認初始容量為10

  Vector:線程安全,但速度慢

    底層數據結構是數組結構

    加載因子為1:即當 元素個數 超過 容量長度 時,進行擴容

    擴容增量:原容量的 1倍

      如 Vector的容量為10,一次擴容後是容量為20

  ArrayList:線程不安全,查詢速度快

    底層數據結構是數組結構

    擴容增量:原容量的 0.5倍+1

      如 ArrayList的容量為10,一次擴容後是容量為16

  Set(集) 元素無序的、不可重復。

  HashSet:線程不安全,存取速度快

     底層實現是一個HashMap(保存數據),實現Set接口

     默認初始容量為16(為何是16,見下方對HashMap的描述)

     加載因子為0.75:即當 元素個數 超過 容量長度的0.75倍 時,進行擴容

     擴容增量:原容量的 1 倍

      如 HashSet的容量為16,一次擴容後是容量為32

  構造方法摘要HashSet()
  HashSet(int initialCapacity)
  構造一個新的空 set,其底層 HashMap 實例具有指定的初始容量和默認的加載因子(0.75)。
  HashSet hs=new HashSet(1);
  所以可見 HashSet類,創建對象的時候是可以的制定容量的大小的 ,期中第二個就具有這個工功能。

  Map是一個雙列集合

  HashMap:默認初始容量為16

     (為何是16:16是2^4,可以提高查詢效率,另外,32=16<<1 -->至於詳細的原因可另行分析,或分析源代碼)

     加載因子為0.75:即當 元素個數 超過 容量長度的0.75倍 時,進行擴容

     擴容增量:原容量的 1 倍

      如 HashSet的容量為16,一次擴容後是容量為32

Java集合類初始容量、加載因子、擴容增量