1. 程式人生 > >Java集合類的總結

Java集合類的總結

依照實現介面分類:

實現Map介面的有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap

實現List介面的有:ArrayList、LinkedList

實現Set介面的有:HashSet、LinkedHashSet、TreeSet

實現Queue介面的有:PriorityQueue、LinkedList、ArrayQueue

 

Set:

HashSet是使用雜湊表(hash table)實現的,其中的元素是無序的。HashSet的addremovecontains

方法 的時間複雜度為常量O(1)。

TreeSet使用樹形結構(演算法書中的紅黑樹red-black tree)實現的。TreeSet中的元素是可排序的,但addremovecontains方法的時間複雜度為O(log(n))。TreeSet還提供了first()、last()、headSet()、tailSet()等方法來操作排序後的集合。

LinkedHashSet介於HashSet和TreeSet之間。它基於一個由連結串列實現的雜湊表,保留了元素插入順序。LinkedHashSet中基本方法的時間複雜度為O(1)。

List和Set的區別 
1. Set 介面例項儲存的是無序的,不重複的資料。List 介面例項儲存的是有序的,可以重複的元素。 
2. Set檢索效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變 ,實現類有HashSet,TreeSet。 
3. List和陣列類似,可以動態增長,根據實際儲存的資料的長度自動增長List的長度。查詢元素效率高,插入刪除效率低,因為會引起其他元素位置改變 ,實現類有ArrayList,LinkedList,Vector,CopyOnWriteArrayList。
 

ArrayList與Vector的區別

兩者都是基於索引,內部結構是陣列
元素存取有序並都允許為null
都支援fail-fast機制
Vector是同步的,不會過載,而ArrayList不是,但ArrayList效率比Vector高,如果在迭代中對集合做修改可以使用CopyOnWriteArrayList
初始容量都為10,但ArrayList預設增長為原來的50%,而Vector預設增長為原來的一倍,並且可以設定
ArrayList更通用,可以使用Collections工具類獲取同步列表和只讀列表
適用場景分析: 
1、Vector是執行緒同步的,所以它也是執行緒安全的,而ArrayList是執行緒非同步的,是不安全的。如果不考慮到執行緒的安全因素,一般用ArrayList效率比較高。 
2、如果集合中的元素的數目大於目前集合陣列的長度時,在集合中使用資料量比較大的資料,用Vector有一定的優勢
 

ArrayList與LinkedList的區別

兩者都是List介面的實現類
ArrayList是基於動態陣列的資料結構,而LinkedList是基於連結串列的資料結構
對於隨機訪問get和set(查詢操作),ArrayList要優於LinkedList,因為LinkedList要移動指標
對於增刪操作(add和remove),LinkedList優於ArrayList
適用場景分析: 
當需要對資料進行對此訪問的情況下選用ArrayList,當需要對資料進行多次增加刪除修改時採用LinkedList

 

HashMap和HashTable的區別 
1. 都是基於hash表實現的,每個元素都是key-value對,內部都是通過單向連結串列解決衝突,容量都會自動增長 
HashMap預設容量為16,每次擴容變為原來的2倍,HashTable初始容量為11,每次擴容變為原來的2倍加1 
2. HashMap繼承自AbstractMap類,HashTable繼承自Dictionary類, 
3. HashTable是同步的,適合多執行緒環境,而HashMap不是,但效率相對較高 
4. HashMap允許key和value為null,而HashTable不允許 
5. Hash值的使用不同,HashTable直接使用物件的hashcode值,而HashMap重新計算hash值 
6. 在Java1.4中引入了HashMap的子類LinkedHashMap,若需要遍歷順序,可以從HashMap轉向LinkedHashMap, 而HashTable的順序是不可預知的 
7. HashMap提供對key的Set進行遍歷,因此它支援fail-fast機制,而HashTable提供對key的Enumeration進行遍歷,不支援fail-fast 
8. HashTable被認為是個遺留的類,如果在迭代的時候修改Map,可以使用ConcurrentHashMap(Java5出現) 
9. HashTable產生於JDK1.1,而HashMap產生於JDK1.2
 

HashSet與TreeSet

HashSet不能保證元素的排列順序,TreeSet是SortedSet介面的唯一實現類,可以確保集合元素處於排序狀態
HashSet底層用的是雜湊表,TreeSet採用的資料結構是紅黑樹
HashSet中元素可以是null,但只能有一個,TreeSet不允許放入null
適用場景分析: 
HashSet是基於Hash演算法實現的,其效能通常都優於TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。

 

HashMap和ConcurrentHashMap的區別 
1、HashMap不是執行緒安全的,而ConcurrentHashMap是執行緒安全的。 
2、ConcurrentHashMap採用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的陣列分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那麼在插入元素的時候就需要先找到應該插入到哪一個片段segment,然後再在這個片段上面進行插入,而且這裡還需要獲取segment鎖。 
3、ConcurrentHashMap讓鎖的粒度更精細一些,併發效能更好。