java中集合的學習與總結
集合與陣列:
陣列:長度固定,可以儲存基本型別。
集合:長度可變,不能儲存基本型別(只能儲存物件)。
集合類框架圖:
Collection介面是集合類的根介面,Java中沒有提供這個介面的直接的實現類。但是卻讓其被繼承產生了兩個介面,就是Set和List。Set中不能包含重複的元素。List是一個有序的集合,可以包含重複的元素,提供了按索引訪問的方式。
Map是Java.util包中的另一個介面,它和Collection介面沒有關係,是相互獨立的,但是都屬於集合類的一部分。Map包含了key-value對。Map不能包含重複的key,但是可以包含相同的value。
Iterator,所有的集合類,都實現了
1. hasNext()是否還有下一個元素。2.next()返回下一個元素。3.remove()刪除當前元素。
兩個主要的集合類介面:
List:實現了collection介面的介面;元素可以重複,元素有序,使用索引可以找到元素。
Set:實現了collection介面的介面;元素不可以重複,元素無序,只能通過遍歷查詢元素。
幾個主要的List實現類:
ArrayList:內部使用陣列來儲存元素,每次擴容,會增加0.5倍的長度。(最適合查詢)
LinkedList:內部使用連結串列來儲存元素。(最適合頻繁的增刪)
Vector:執行緒安全。內部使用陣列來儲存元素,每次擴容,會增長
幾個主要的Set實現類:
HashSet:內部使用HashMap的key來儲存資料,value都是相同的預設值。
LinkedHashSet:內部使用LinkedHashMap來儲存資料。繼承自HashSet。
TreeSet:內部使用TreeMap來儲存資料。沒有繼承HashSet,有很多自己獨有的導航方法。
幾個主要的Map實現類:
HashMap:內部使用HashTable來儲存資料;通過HashCode來確定key在雜湊陣列中的位置,然後再用equals方法確定該位置的單向連結串列中又沒有該key,從而保證key唯一;因此,key可以為null,但只能有一個null。
HashTable
陣列的特點是:定址容易,插入和刪除困難;
而連結串列的特點是:定址困難,插入和刪除容易。
那麼我們能不能綜合兩者的特性,做出一種定址容易,插入刪除也容易的資料結構?答案是肯定的,這就是我們要提起的雜湊表,雜湊表有多種不同的實現方法,我接下來解釋的是最常用的一種方法——拉鍊法,我們可以理解為“連結串列的陣列”,如圖:
LinkedhashMap:內部使用帶雙向連結串列的HshTable來儲存資料,就是說在原來基礎的HashTable上,每個元素又多了after,befor兩個成員來維護雙向連結串列的結構,通過這個雙向連結串列結構來維護元素插入的順序。
帶雙向連結串列的HashTable:
本質上,HashMap和雙向連結串列合二為一即是LinkedHashMap。所謂LinkedHashMap,其落腳點在HashMap,因此更準確地說,它是一個將所有Entry節點鏈入一個雙向連結串列雙向連結串列的HashMap。在LinkedHashMapMap中,所有put進來的Entry都儲存在如下面第一個圖所示的雜湊表中,但由於它又額外定義了一個以head為頭結點的雙向連結串列(如下面第二個圖所示),因此對於每次put進來Entry,除了將其儲存到雜湊表中對應的位置上之外,還會將其插入到雙向連結串列的尾部。
以上兩者結合起來,就是linkedHashMap了。
每一個節點的示意圖:
TreeHashMap:內部使用紅黑樹來儲存資料;儲存的物件,必須實現compareTo方法,或者,建立TreeHashMap物件時,實現一個Comparable介面作為引數傳入構造方法中。
紅黑樹插入刪除比較複雜,下圖簡單展示一下查詢方法。