java三大集合框架(面試知識儲備精華篇)
java三大集合框架 : set list map
如上圖 set list 都屬於collection的子介面(collection為頂層介面) Map 不屬於collection介面
Set介面:
無序可變的陣列,不允許新增重複元素,如果檢視把兩個相同的元素加入到同一個集合中,add方法返回false.
set判斷物件是否相同使用equals方法, 就是說返回true就表示兩個物件相同 set不會接受.
HashSet:
不能保證元素的排列順序,
不是同步的(執行緒不安全)
集合元素可以是null,但只能放入一個null
當向HashSet集合中存入一個元素時,HashSet
判斷兩個HashSet元素相等的標準是兩個物件通過equals方法比較相等,並且兩個物件的HashCode()方法返回值相等
如果要一個物件放入HashSet中,重寫該物件對應類的equals方法,也應該重寫HashCode()方法.
LinkedHashSet:
LinkedHashSet集合同樣是根據HashCode()方法來決定元素的儲存位置,但是它同時使用連結串列維護元素的次序.這樣使得元素看起來像是以插入順序儲存的,當遍歷該集合的時候,LinkedHashSet將會以元素的新增順序訪問集合的元素.
LinkedHashSet在迭代訪問Set中的全部元素時,效能比HashSet好,但是插入時效能稍遜色於HashSet.
TreeSet:
TreeSet是SortedSet介面的唯一實現類,TreeSet可以確保集合元素處於排序狀態。
TreeSet支援兩種排序方式,自然排序 和定製排序,其中自然排序為預設的排序方式。
TreeSet判斷兩個物件不相等的方式是兩個物件通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
自然排序:
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,然後將元素按照升序排列。
Java提供了一個Comparable介面,該接口裡定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該介面的物件就可以比較大小。
obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個物件相等,如果返回一個正數,則表明obj1大於obj2,如果是 負數,則表明obj1小於obj2。
如果我們將兩個物件的equals方法總是返回true,則這兩個物件的compareTo方法返回應該返回0
定製排序:
自然排序是根據集合元素的大小,以升序排列,如果要定製排序,應該使用Comparator介面,實現 int compare(T o1,T o2)方法
List介面:
一個 List 是一個元素有序的、可以重複、可以為 null 的集合(有時候我們也叫它“序列”)
ArrayList:代表長度可以改變得陣列。可以對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢。
LinkedList:在實現中採用連結串列資料結構。插入和刪除速度快,訪問速度慢。
Vector:Vector與ArrayList一樣,也是通過陣列實現的,不同的是它支援執行緒的同步,即某一時刻只有一個執行緒能夠寫Vector,避免多執行緒同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。
補充:ListIterator(list特有的迭代器)提供了對List的雙向遍歷的方法。
Queue介面:暫時不討論感興趣的同學可以自行查詢
Map介面:
Map是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件。 Map沒有繼承於Collection介面 從Map集合中檢索元素時,只要給出鍵物件,就會返回對應的值物件。
HashTable:類實現一個雜湊表,該雜湊表將鍵對映到相應的值。任何非 null 物件都可以用作鍵或值。為了成功地在雜湊表中儲存和獲取物件,用作鍵的物件必須實現 hashCode 方法和 equals 方法。
HashMap:Map基於散列表的實現。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設定容量capacity和負載因子load factor,以調整容器的效能。
LinkedHashMap: 類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用連結串列維護內部次序。
TreeMap:基於紅黑樹資料結構的實現。檢視“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在 於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
相關知識:
迭代器(Iterator)
提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。
對於遍歷一個容器中所有的元素,Iterator模式是首選的方式
Collection定義了Iterator<E> iterator()方法,子類都各自實現了該方法,我們直接呼叫即可
Map中雖沒有定義,我們可以利用map.entrySet()的iterator()方法