1.Java集合框架圖
Collections框架主要有兩個接口:Collection、Map
Collection接口有兩個子接口:List和Set. (List接口允許null,可以重複,具有存儲順序;Set接口允許null,不可以重複)
2、List接口有3個實現類分別是:ArrayList、LinkedList、Vector,它們的共同點以及不同點是:
(1)ArrayList和Vector都是索引速度快,插入數據慢
ArrayList和Vector都是基於存儲元素的Object[ ] array實現的,它們會在內存中開闢一塊連續的空間來存儲,因此,它們支持用序號(下標)來訪問元素,同時索引數據的速度比較快。但是插入元素時需要移動容器中的元素,所以對數據的插入操作執行得比較慢。ArrayList和Vector都有一個初始化的容量的大小,當裏面存儲的元素超過這個大小時就需要動態地擴充它們的存儲空間。Vector默認擴充爲原來的2倍(每次擴充空間的大小是可以設置的),而ArrayList默認擴充爲原來的1.5倍(沒有提供方法來設置空間擴充的方法)
(2)ArrayList非同步、非線程安全,Vector同步、線程安全
沒有一個ArrayList的方法是同步的,而Vector的絕大多數方法(例如add、insert、remove、set、equals、hashcode等)都是直接或者間接同步的,所以Vector是線程安全的,ArrayList不是線程安全的。
(3)LinkedList索引數據慢,插入數據快
LinkedList是採用雙向列表實現的,對數據的索引需要從列表頭開始遍歷,因此用於隨機訪問則效率比較低,但是插入元素時不需要對數據進行移動,因此插入效率較高。同時,LinkedList也是非線程安全的。
總結:當對數據的主要操作爲索引或只是在集合的末端增加、刪除元素時,使用ArrayList和Vector效率比較高;當對數據的操作主要是爲指定位置的插入或刪除操作時,使用LinkedList效率比較高;當在多線程中使用容器時,選用Vector較爲安全。
3.Set接口主要有三個實現類:HashSet、LinkedHashSet、TreeSet
(1)HashSet
HashSet有以下特點:
-> 不能保證元素的排列順序,順序有可能發生變化。
-> 不是同步的。
-> 集合元素可以是null,但只能放入一個null。
當向HashSet結合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然後根據 hashCode值來決定該對象在HashSet中存儲位置。簡單的說,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,並且兩個對象的hashCode()方法返回值也相等。
注意,如果要把一個對象放入HashSet中,重寫該對象對應類的equals方法,也應該重寫其hashCode()方法。其規則是如果兩個對象通過equals方法比較返回true時,其hashCode也應該相同。另外,對象中用作equals比較標準的屬性,都應該用來計算 hashCode的值。
(2)LinkedHashSet
LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。
LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色於HashSet。
(3)TreeSet
TreeSet是SortedSet接口的唯一實現類,TreeSet可以確保集合元素處於排序狀態。TreeSet支持兩種排序方式,自然排序和定製排序,其中自然排序爲默認的排序方式。向TreeSet中加入的應該是同一個類的對象。
TreeSet判斷兩個對象不相等的方式是兩個對象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0。
4.HashMap接口有幾個常用的實現類,HashMap、TreeMap、LinkedHashMap。其中HashMap最常用。
(1)HashMap,基於散列表實現,查找速度快(依賴hashcode()和equals()),存放元素無序。
(2)TreeMap,基於紅黑樹實現,存放有序(依賴Compareable)。
(3)LinkedHashMap,基於散列表、雙向鏈表實現。如HashMap的查找速度,遍歷時有序(默認爲插入順序,可通過構造方法設置“最近最少使用(Least Recently Used)順序”)。