1. 程式人生 > >ArrayList、Vector、HashMap、HashTable、HashSet的預設初始容量、載入因子、擴容增量

ArrayList、Vector、HashMap、HashTable、HashSet的預設初始容量、載入因子、擴容增量

主要是面試被問到了,來記錄一下。

這裡要討論這些常用的預設初始容量和擴容的原因是:

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

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

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

1.List 元素是有序的、可重複

ArrayList、Vector預設初始容量為10

Vector:執行緒安全,但速度慢

              底層資料結構是陣列結構

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

              擴容增量:原容量的 1倍。如 Vector的容量為10,一次擴容後是容量為20

ArrayList:執行緒不安全,查詢速度快

                  底層資料結構是陣列結構

                  擴容增量:原容量的 0.5倍+1。如 ArrayList的容量為10,一次擴容後是容量為16

2.Set元素無序的、不可重複

HashSet:執行緒不安全,存取速度快

                 底層實現是一個HashMap(儲存資料),實現Set介面

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

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

                 擴容增量:原容量的 1 倍。如 HashSet的容量為16,一次擴容後是容量為32

3.Map集合

HashMap:預設初始容量為16,長度始終保持2的n次方

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

                  擴容增量:原容量的 1 倍。如 HashMap的容量為16,一次擴容後是容量為32

HashTable:預設初始容量為11

                    執行緒安全,但是速度慢,不允許key/value為null

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

                    擴容增量:2*原陣列長度+1。如 HashTable的容量為11,一次擴容後是容量為23