arraylist是list介面的可變陣列非同步實現,並允許包括null在內的所有元素。
底層使用陣列實現
該集合是可變長度陣列,陣列擴容時,會將老陣列中的元素重新拷貝乙份到新的陣列中,每次陣列容量增長大約是其容量的1.5倍,這種操作的代價很高。
採用了fail-fast機制,面對併發的修改時,迭代器很快就會完全失敗,而不是冒著在將來某個不確定時間發生任意不確定行為的風險
remove方法會讓下標到陣列末尾的元素向前移動乙個單位,並把最後一位的值置空,方便gc
linkedlist是list介面的雙向鍊錶非同步實現,並允許包括null在內的所有元素。
底層的資料結構是基於雙向鍊錶的,該資料結構我們稱為節點
它的查詢是分兩半查詢,先判斷index是在鍊錶的哪一半,然後再去對應區域查詢,這樣最多只要遍歷鍊錶的一半節點即可找到
hashmap是基於雜湊表的map介面的非同步實現,允許使用null值和null鍵,但不保證對映的順序。
底層使用陣列實現,陣列中每一項是個單向鍊錶,即陣列和鍊錶的結合體;當鍊表長度大於一定閾值時,鍊錶轉換為紅黑樹,這樣減少鍊錶查詢時間。
hashmap在底層將key-value當成乙個整體進行處理,這個整體就是乙個node物件。hashmap底層採用乙個node陣列來儲存所有的key-value對,當需要儲存乙個node物件時,會根據key的hash演算法來決定其在陣列中的儲存位置,在根據equals方法決定其在該陣列位置上的鍊錶中的儲存位置;當需要取出乙個node時,也會根據key的hash演算法找到其在陣列中的儲存位置,再根據equals方法從該位置上的鍊錶中取出該node。
hashmap進行陣列擴容需要重新計算擴容後每個元素在陣列中的位置,很耗效能
採用了fail-fast機制,通過乙個modcount值記錄修改次數,對hashmap內容的修改都將增加這個值。迭代器初始化過程中會將這個值賦給迭代器的expectedmodcount,在迭代過程中,判斷modcount跟expectedmodcount是否相等,如果不相等就表示已經有其他執行緒修改了map,馬上丟擲異常
hashtable是基於雜湊表的map介面的同步實現,不允許使用null值和null鍵
底層使用陣列實現,陣列中每一項是個單鏈表,即陣列和鍊錶的結合體
hashtable在底層將key-value當成乙個整體進行處理,這個整體就是乙個entry物件。hashtable底層採用乙個entry陣列來儲存所有的key-value對,當需要儲存乙個entry物件時,會根據key的hash演算法來決定其在陣列中的儲存位置,在根據equals方法決定其在該陣列位置上的鍊錶中的儲存位置;當需要取出乙個entry時,也會根據key的hash演算法找到其在陣列中的儲存位置,再根據equals方法從該位置上的鍊錶中取出該entry。
synchronized是針對整張hash表的,即每次鎖住整張表讓執行緒獨佔
hashset由雜湊表(實際上是乙個hashmap例項)支援,不保證set的迭代順序,並允許使用null元素。
基於hashmap實現,api也是對hashmap的行為進行了封裝,可參考hashmap
Java的陣列集合概括
1.1 arraylist 底層是陣列實現的,執行緒不安全,查詢和修改快,增刪比較慢 1.2 linkedlist 底層是鍊錶實現的,執行緒不安全,增刪比較快,查詢和修改計較慢 1.3 vector 底層是陣列實現的,執行緒是安全的,無論增刪改查都比較慢 結論 如果查詢和修改多,用 arraylis...
Java 遍歷Map集合的各種姿勢
最常用,在鍵值都需要時使用。mapmap new hashmap for map.entryentry map.entryset 複製 在for each迴圈中遍歷keys或values。mapmap new hashmap 遍歷map中的鍵 for integer key map.keyset 遍...
Java 遍歷Map集合的各種姿勢
最常用,在鍵值都需要時使用。mapmap new hashmap for map.entryentry map.entryset 複製 在for each迴圈中遍歷keys或values。mapmap new hashmap 遍歷map中的鍵 for integer key map.keyset 遍...