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:
entry
連接起來,這樣是爲保證元素的迭代順序跟插入順序相同