Java語言中List、Set、Map三種集合之間的區別
List、Set是實現了Collection介面的子介面;而Map是另一個集合介面。
1. 三者之間的區別如下:
1) 元素重複性:
① List允許有重複的元素。任何數量的重複元素都可以在不影響現有重複元素的值及其索引的情況下插入到List集合中;
② Set集合不允許元素重複。Set以及所有實現了Set介面的類都不允許重複值的插入,若多次插入同一個元素時,在該集合中只顯示一個;
③ Map以鍵值對的形式對元素進行儲存。Map不允許有重複鍵,但允許有不同鍵對應的重複的值;
2) 元素的有序性:
① List及其所有實現類保持了每個元素的插入順序;
② Set中的元素都是無序的;但是某些Set的實現類以某種殊形式對其中的元素進行排序,如:LinkedHashSet按照元素的插入順序進行排序;
③ Map跟Set一樣對元素進行無序儲存,但其某些實現類對元素進行了排序。如:TreeMap根據鍵對其中的元素進行升序排序;
3) 元素是否為空值:
① List允許任意數量的空值;
② Set最多允許一個空值的出現;[ 當向Set集合中新增多個null值時,在該Set集合中只會顯示一個null元素]
③ Map只允許出現一個空鍵,但允許出現任意數量的空值;
總結: List中的元素,有序、可重複、可為空;
Set中的元素,無序、不重複、只有一個空元素;
Map中的元素,無序、鍵不重,值可重、可一個空鍵、多可空值;
2. 實現類:
① List:ArrayList、LinkedList;
② Set:HashSet、LinkedHashSet、TreeSet、SortedSet等等;
③ Map:HashMap、TreeMap、WeakHashMap、LinkedHashMap、IdentityHashMap等等;
3. List集合的子類ArrayList、Vector、LinkedList之間的區別:
ArrayList和Vector都是以陣列的方式儲存資料的,此陣列長度大於實際儲存元素個數,以方便插入元素;它們都允許直接按索引獲取元素;由於在插入資料時,涉及到陣列元素的移動等記憶體操作,所以在插入資料時執行速度較慢;Vector是執行緒安全的(synchronized),所以效能上要比ArrayList差;
而LinkedList是以雙向連結串列的形式儲存資料的,在按索引獲取資料時只需要向前或者向後進行遍歷即可;在插入資料時,只需要記錄本項的前後項即可,所以插入速度較快。
4. HashMap和HashTable的區別:
HashMap時HashTable的輕量級實現(非執行緒安全的實現),它們都實現了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非執行緒安全,效率上高於HashTable。
HashMap允許將null作為一個entry的key或者value,而HashTable不允許。
HashMap去掉了HashTable的contains方法,改成containsValue和containsKey方法。
二者最大的不同是,HashTable的方法是synchronized(執行緒安全的),而HashMap不是,在多個執行緒訪問HashTable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。