1. 程式人生 > >HashMap,Hashset,ArrayList,LinkedList集合的區別

HashMap,Hashset,ArrayList,LinkedList集合的區別

HashSet

        1. HashSet不能夠儲存相同的元素,元素是否相同的判斷:重寫元素的equals方法。equals方法和hashCode方法必須相容,如:equals方法判斷的是使用者的名字name,那麼hashCode的返回的hashcode必須是namehashcode();

        2. HashSet儲存是無序的,儲存的順序與新增的順序是不一致的,它不是線性結構,而是雜湊結構,(通過散列表:雜湊單元指向連結串列)。因此,HashSet的查詢效率相對比較高。

        3. HashSet不是執行緒安全的,不是執行緒同步的。這需要自己實現執行緒同步:

Collections.synchronizedCollection(),方法實現。

ArrayList

         1.  不是執行緒安全的,不是執行緒同步的。

         2.ArrayList是通過可變大小的陣列實現的,允許null在內的所有元素。

         3.ArrayList中存放順序和新增順序是一致的。並且可重複元素。

         4.ArrayList適合通過位子來讀取元素。

LinkedList

         1.不是執行緒安全的,不是執行緒同步的。

         2.LinkedList是通過雙向迴圈連結串列來實現的。

         3.存放順序和新增順序是一致的。可新增重複元素。

         4.適合連結串列頭尾操作和插入指定位置元素的操作。

ArrayListLinkedList之間的資料傳遞可通過toArray()方法。

HashMap

          1.非執行緒安全,不是執行緒同步。

          2.新增順序和儲存的順序是不一致的。

          3.必須重寫keyequals方法和hashCode方法。

          4.HashMap的實際容量=容量*因子,預設為16*0.75=12.所以考慮到HashMap的新增的效率問題,根據實際情況來設計它的開始的預設的容量。

           的操作方法根據api來查詢。

          5.新增的值中是允許有

null的值存在的。

Hashtable

          1.是執行緒安全的,是執行緒同步的,在實現執行緒同步的時候是不需要手動來實現執行緒同步的。因此相對效率低。

          2.新增的順序和儲存的順序是不一致的。

          3.新增的值中是不允許有null值存在的。

底層原理

HashMap:HashMap實現了Map介面,底層使用的是Hash演算法儲存資料。HashMap將資料以鍵值對的方式儲存。

HashSet:HashSet實現了Set介面,底層也是用的是Hash演算法儲存資料。而且HashSet內部有HashMap型別的成員變數,方法也呼叫了HashMap的方法,儲存的時候只不過值為null.

ArrayList:ArrayList實現了List介面,底層使用的是陣列,儲存空間上是相鄰的,所以查詢起來會很方便,效率也會比LinkedList要高

LinkedList:實現了List介面,底層使用的是使用雙向連結串列的形式,儲存的資料在空間上很可能不相鄰,但是他們都有一個引用連在一起,所以增刪起來會很方便