Java集合型別的預設容量以及擴容機制

2021-08-20 22:49:51 字數 1556 閱讀 6162

arraylist

vector

vector是執行緒安全版的arraylist內部實現都是用陣列實現的。vector通過在方法前用synchronized修飾實現了執行緒同步功能

- vector預設容量是10

- vector最大容量integer.max_value - 8

- vector擴容機制,如果使用者沒有指定擴容步長,按原陣列長度的2倍擴容,否則按使用者指定的擴容步長擴容。如果擴容後的大小小於實際需要的大小,將陣列擴大到實際需要的大小

stack

stack繼承自vector。新增了同步的push(e e),pop(),peek()方法,預設容量和擴容機制同vector

- stack預設容量是10

- stack最大容量integer.max_value - 8

- stack擴容機制,如果使用者沒有指定擴容步長,按原陣列長度的2倍擴容,否則按使用者指定的擴容步長擴容。如果擴容後的大小小於實際需要的大小,將陣列擴大到實際需要的大小

copyonwritearraylist

copyonwritearraylist是執行緒同步的陣列集合。copyonwritearraylist使用場景主要是多執行緒環境下,查詢、遍歷操作明顯多於增加、刪除操作。

- copyonwritearraylist預設容量是0,從0開始

- copyonwritearraylist沒有規定最大容量(適合在查詢操作頻繁的場景下使用,容量變化不大)

- copyonwritearraylist擴容機制,每次+1

linkedlist

linkedlist是用雙鏈表實現的。對容量沒有要求,也不需要擴容

arrayblockingqueue

arrayblockingqueue是基於陣列實現的執行緒安全的有界佇列。它的容量是使用者傳遞進來的。(內部使用reentrantlock實現執行緒同步)

concurrentlinkedqueue

concurrentlinkedqueue是基於單鏈表實現的執行緒安全的無界佇列。(內部使用cas實現執行緒同步是樂觀鎖)

delayqueue、priorityqueue

非執行緒安全的無界佇列。

linkedblockingqueue

linkedblockingqueue是基於單鏈表實現的執行緒安全的無界佇列。(內部使用takelock和putlock讀寫分離鎖實現)

hashmap

hashmap是基於陣列和鍊錶/紅黑樹實現的。hashmap的容量必須是2的冪次方(原因是(n-1)&hash是取模操作,n必須是2的冪次方)

- hashmap預設容量是16

- hashmap最大容量2的30次方

- hashmap擴容機制,擴容到原陣列的兩倍

concurrenthashmap

// todo

hashtable

linkedhashmap

繼承自hashmap擴容機制同hashmap

treemap

treemap由紅黑樹實現,容量方面沒有限制

weakhashmap

同hashmap

Java常用集合的預設容量以及擴容機制

vector是執行緒安全版的arraylist內部實現都是用陣列實現的。vector通過在方法前用synchronized修飾實現了執行緒同步功能 stack繼承自vector。新增了同步的push e e pop peek 方法,預設容量和擴容機制同vector copyonwritearrayl...

集合預設容量大小

這裡要討論這些常用的預設初始容量和擴容的原因是 當底層實現涉及到擴容時,容器或重新分配一段更大的連續記憶體 如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配記憶體 要將容器原來的資料全部複製到新的記憶體上,這無疑使效率大大降低。載入因子的係數小於等於1,意指 即當 元素個數 超過 容...

集合的預設初始容量 載入因子 擴容增量

集合的初始容量很簡單,集合在建立時有乙個預設的大小。當程式集合的初始容量不夠使用時,就需要去擴容。擴容就是增加容量。而載入因子是雜湊表在其容量自動增加之前可以達到多滿的一種尺度。什麼意思呢?當集合的條目數超出了載入因子與當前容量的乘積時,通過呼叫 rehash 方法將容量翻倍。比如,將初始容量設定為...