Java基礎:List 、Set 、Map集合聯繫與區別

List Map Set 集合

一、基礎概念

1. Collection 和 Map 接口

​       Java集合框架主要由 CollectionMap兩個根接口及其子接口、實現類組成。

​ ​       1) Collection 接口是Set、List、和Queue接口的父接口:

​ ​       Collection: Set 、List 、Queue 1. Set集合包括: HashSet ( LinkedHashSet)、SortedSet (TreeSet)、EnumSet 2. List集合包括: ArrayList 、 LinkedList 、 Vector 3. Queue集合: (併發編程中涉及,一般用於緩衝,併發訪問) 其中 ArrayList 、LinkedList 、HashSet 、 TreeSet 爲常用實現類。且這些都是線程不安全集合

​ ​       2) Map 接口實現類保存具有映射關係的數據。每項數據由鍵值對(key ,value)組成,其中key不可重複:

​       ​ Map 主要實現類:HashMap (LinkedHashMap)、SortedMap(TreeMap) 、HashTable(Properties)、 EnumMap等

其中 HashMap 、TreeMap 爲常用實現類。且這些也都是線程不安全集合

​ ​       3) 線程安全集合 總結

​ ​       上述提到了線程不安全集合,哪些又是線程安全的。

​ ​       線程安全集合:Vector 、HashTable 、StringBuffer

​        非線程安全集合:ArrayList 、LinkedList 、HashMap、HashSet、TreeMap、TreeSet 、StringBuilder

​ ​       並且Vector與HashTable屬於被淘汰的類,不推薦使用。若需要線程安全,可以使用ConcurrentHashMap。

二、集合接口

1)List 集合

​       ​ List集合儲存對象爲 重複且有序

​       1. ArrayList :數組集合類型;可動態增加容量

​       ​ 特點:元素增刪慢,查詢快

​       2. LinkedList :鏈表集合類型;雙向循環列表,可用作爲堆棧

​ ​       特點:方便增刪

​       3.常用方法:

​ ​       具體方法查看 ArrayList APILinkedList API

​       ​ add(Object e):添加元素,按照插入的順序排列

​       ​ add(int index, Object e):向指定索引處添加元素,原有元素依次後移

​       ​ remove(Object e):刪除指定元素,返回值爲被刪除的元素

​ ​       remove(int index):刪除指定索引處元素,返回值爲被刪除的元素

​ ​       set(int index, Object e):將索引處的元素替換成指定元素,返回值爲替換前的元素

​ ​       get(int index):獲取指定索引處的元素,並返回該元素

 

2)Set集合

​ ​       Set集合儲存對象爲 唯一且無序 。(插入順序與遍歷循序不一致)

​       1. HashSet :元素不重複且無序集合,有且僅有一個元素爲null

​       2. TreeSet:元素不重複但有序(樹結構)集合 ,元素不能爲null;

​       3. 常用方法:

​       ​ 具體方法查看 HashSet API TreeSet API

boolean add(E e) 將指定的元素添加到此組如果尚未存在。
void clear() 刪除所有從這個集合的元素。
Object clone() 返回一個淺拷貝的HashSet實例:元素本身不是克隆。
boolean contains(Object o) 如果這個集合包含指定的元素返回true。
boolean isEmpty() 如果這組不包含任何元素返回true。
Iterator<E> iterator() 返回一個迭代器在這個集合的元素。
boolean remove(Object o) 從這組刪除指定的元素是否存在。
int size() 返回元素的數量在這集(基數)。

3) Map集合

​       ​ Map集合接口 表示一個鍵值對(key,value)的映射。其中:

​ ​       1.KeySet:爲一個Map中 鍵(key)的集合,以Set的形式保存,所以不能重複。通過Map.KeySer()方法獲取。遍歷方法:

Set set = map.KeySet();
for(Object key : set){
    System.out.println(map.get(key));
}

 

​       ​ 2.Values: 爲一個Map中 值(value)的集合,以Collection的形式保存,所以可重複。通過Map.Values()方法獲取。遍歷方法:

Collection values = map.Values();
Iterator it = values.iterator();
while(it.hasNext()){
    System.out.printLn(it.next());
}

 

​       ​ 3.Entry:爲Map接口中的靜態內部接口,表示某個鍵值對的映射。通過Map.entrySet()方法獲取一組Entry集合,並保存在Set中;遍歷方法:

Set entrySet = map.entrySet();
 for (Object entrys : entrySet) {
     Map.Entry entry = (Map.Entry) entrys; //獲取到一組Entry
    System.out.println(entry);      //key=value
     System.out.println(entry.getKey() + " / " + entry.getValue());
 }
  1. HashMap: 速度快,無序 ; 線程不安全,key-value 允許爲空

  2. TreeMap: 有序 ,效率比hashMap低

  3. LinkedHashMap: (HashMap子類)結合HashMap和TreeMap的優點:有序效率高

​       應用場景:

​       ​ 快速查詢考慮 HashMap ;

​       ​ 需特定排序考慮 TreeMap ;

​        僅需要插入順序考慮LinkedhashMap ;

​       HashMap API ;

 

三 、相關集合之間的區別

1)List集合:Vector 、ArrayList、LinkedList 對比

  1. Vector是矢量隊列,和ArrayList一樣,它也是一個動態數組,由數組實現。但Vector是線程安全的,所以訪問速度上會比ArrayList慢。ArrayList中的操作不是線程安全的,所以在單線程使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。

  2. ArrayList是一個數組隊列,相當於 動態數組。實現List接口及繼承AbstractList類。它由數組實現,隨機訪問效率高,隨機插入、隨機刪除效率低。 ArrayList支持序列化,而Vector不支持。

  3. LinkedList是實現List接口同時繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。 LinkedList隨機訪問效率低,但隨機插入、隨機刪除效率低

總結:

  1. 對於需要快速插入,刪除元素,應該使用LinkedList。

  2. 對於需要快速隨機訪問元素,應該使用ArrayList。

  3. 對於“單線程環境” 或者 “多線程環境,但List僅僅只會被單個線程操作”,此時應該使用非同步的類。

 

2)Map集合:HashMap、Hashtable、TreeMap對比

  1. HashMap 是基於“拉鍊法”實現的散列表。一般用於單線程程序中。key、value都可以爲null,且只支持Iterator迭代器遍歷。  

  2. Hashtable 也是基於“拉鍊法”實現的散列表。它一般用於多線程程序中。 key、value都不可以爲null,支持Iterator與Enumeration枚舉器兩種方式遍歷。

  3. TreeMap 是有序的key-value集合,它是通過紅黑樹實現的。它一般用於單線程中存儲有序的映射。

 

3)Set集合:HashSet、TreeSet 對比

Set集合繼承與Collection接口。是一個不重複元素的集合。

  1. HashSet依賴於HashMap(通過HashMap實現的),HashSet中元素是無序的。且允許null元素。

  2. TreeSet依賴於TreeMap(通過TreeMap實現的),TreeSet中的元素是有序的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章