Java 集合基礎

ArrayList:

1.允許爲空、允許重複、有序、非線程安全

2.底層以elementDate數組實現,初始數組大小爲10,擴容是(當前size*3)/2+1

3.順序插入(在數組尾部直接插入)時速度較快,當在指定位置插入或者刪除元素時涉及到數據搬運,速度會較慢。

LinkedList:

1.允許爲空、允許重複、有序、非線程安全

2.底層以雙向列表實現(每個元素前後都有個引用地址)

3.插入和刪除數據時只需查到到數據位置然後改變前後引用,查詢時底層實現會判斷查找位置大於或小於列表中間位置,確定往前查找還是往後查找。

所以,如果待插入、刪除的元素是在數據結構的前半段尤其是非常靠前的位置的時候,LinkedList的效率將大大快過ArrayList,因爲ArrayList將批量copy大量的元素;越往後,對於LinkedList來說,因爲它是雙向鏈表,所以在第2個元素後面插入一個數據和在倒數第2個元素後面插入一個元素在效率上基本沒有差別,但是ArrayList由於要批量copy的元素越來越少,操作速度必然追上乃至超過LinkedList。

從這個分析看出,如果你十分確定你插入、刪除的元素是在前半段,那麼就使用LinkedList;如果你十分確定你刪除、刪除的元素在比較靠後的位置,那麼可以考慮使用ArrayList。如果你不能確定你要做的插入、刪除是在哪兒呢?那還是建議你使用LinkedList吧,因爲一來LinkedList整體插入、刪除的執行效率比較穩定,沒有ArrayList這種越往後越快的情況;二來插入元素的時候,弄得不好ArrayList就要進行一次擴容,記住,ArrayList底層數組擴容是一個既消耗時間又消耗空間的操作。

HashMap:

1.key,value都允許爲空、key不能重複否則value值會被覆蓋、無序、非線程安全

2.底層以單向列表實現,初始化大小爲16的Entry數組,每次擴充爲原來的2倍

3.當添加元素key爲空時,會放在第一個位置,put操作時會重新計算key的hashCode,HashMap它的順序是基於HashCode,HashCode是一個隨機性很強的數字,所以HashMap中的Entry完全是隨機存放的。HashMap又不像LinkedHashMap這樣維護了插入元素的順序

HashTable:

1.key,value都不允許爲空、key不能重複否則value值會被覆蓋、無序、非線程安全

2.每次擴充爲原來的2n+1

3.hashTabel的對外方法都用synchronized修飾了

LinkedHashMap:

1.key,value都允許爲空、key不能重複否則value值會被覆蓋、有序、非線程安全
2.LinkedHashMap可以認爲是HashMap+LinkedList,即它既使用HashMap操作數據結構,又使用LinkedList維護插入元素的先後順序,採用雙向鏈表(doubly-linked list)的形式將所有entry連接起來,這樣是爲保證元素的迭代順序跟插入順序相同
3.每次訪問一個元素(get或put),被訪問的元素都被提到最後面去了

TreeMap:
1.TreeMap是用紅黑樹作爲基礎實現的,紅黑樹是一種二叉搜索樹,特點是左子樹的值小於根節點,右子樹的值大於根節點




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章