【Java總結】——集合(二)之Collection 介面
前言 |
在之前的一篇部落格中簡單介紹過一些集合的知識(點我),有需要的可以簡單看看,這次主要是針對集合的Collection中的一些常用的實現類做簡單的介紹。
Collection介面是List、Set和Queue介面的父介面,該接口裡定義的方法既可以用於操作Set集合,也可用於操作List和Queue集合。
Collection介面和繼承樹 |
HashSet |
HashSet是Set介面的典型實現,大多數時候使用Set集合時就是使用這個實現類。HashSet按Hash演算法來儲存集合中的元素,因此有很好的存取和查詢效能。
HashSet特點:
- 不能保證元素的排序順序,順序可能與新增順序不同,順序也有可能發生變化。
- HashSet不是同步的,如果對個執行緒同時訪問一個HashSet,假設有連個或者兩個以上執行緒同時修改了HashSet集合時,則必須通過程式碼來保證其同步。
集合元素值可以是null。
當向HashSet集合存入一個元素時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,然後根據該hashCode值決定該物件在HashSet中的儲存位置。如果有兩個元素通過equals()方法比較返回true,但它們的hashCode()方法返回值不相等,HashSet將會把它們儲存在不同的位置,依然可以新增成功。即,HashSet集合判斷兩個元素相等的標準是兩個物件通過equals()方法比較相等,並且兩個物件的hashCode()方法返回值也相等。
TreeSet |
TreeSet是SortedSet介面的實現類,TreeSet可以確保集合元素處於排序狀態。
- HashSet集合採用hash演算法決定元素的儲存位置。
- TreeSet採用紅黑樹的資料結構儲存集合元素。
TreeSet支援兩種排方法:
- 自然排序
- 定製排序
ArrayList和Vector |
ArrayList和Vector是List的兩個典型實現,是基於陣列實現的List類,二者封裝了一個動態的,允許再分配的Object[]陣列。
顯著區別:
- ArrayList是執行緒不安全的
- Vector集合則是執行緒安全的
Vector是一個古老的集合,有很多缺點。Vector是執行緒安全的,所以Vector的效能比 ArrayList的效能要低。實際上,即時需要保證List集合執行緒安全,也同樣不推薦使用Vector實現類。
Deque介面與ArrayDeque實現類 |
Deque介面是Queue介面的子介面,它代表一個雙端佇列,Deque接口裡定義了一些雙端佇列的方法,這些方法允許從兩端來操作佇列的元素。同時Deque還可以當成棧來使用。
Deque介面提供了一個典型的實現類:ArrayDeque,它是一個基於陣列實現的雙端佇列,建立Deque時同樣可指定一個numElements引數,該引數用於指定Object[]陣列的長度;若不指定,Deque底層陣列的長度為16。
當程式需要使用“棧”這種資料結構時,推薦使用ArrayDeque,儘量避免使用Stack—Stack是古老的集合,效能較差。
LinkedList實現類 |
LinkedList類是List介面的實現類,這意味著它是一個List集合,可以根據所引來隨機訪問集合中的元素。除此之外,LinkedList還實現了Deque介面,可以被當成雙端對列來使用,因此即可以被當成“棧”,也可以被當成對列使用。
LinkedList可以作為List集合、雙端對列和棧來使用,是一個功能非常強大的集合類。
總結 |
LinkedList與ArrayList、ArrayDeque的實現機制完全不同,ArrayList、ArrayDeque內部以陣列的形式來儲存集合中的元素,因此隨機訪問集合元素時有較好的的效能;而LinkedList內部以連結串列的形式來儲存集合中的元素,因此隨機訪問集合元素時效能較差,但在插入、刪除元素時效能比較出色。
總體來說,ArrayList的效能比LinkedList的效能要好,因此大部分時候都應該考慮使用ArrayList。
雖然Vector也是以陣列形式儲存集合元素,但因為它實現了執行緒同步的功能(而且實現機制也不好),所以各方面效能都比較差。