List Map Set 集合
一、基礎概念
1. Collection 和 Map 接口
Java集合框架主要由 Collection和Map兩個根接口及其子接口、實現類組成。
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 API 和 LinkedList 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());
}
-
HashMap: 速度快,無序 ; 線程不安全,key-value 允許爲空
-
TreeMap: 有序 ,效率比hashMap低
-
LinkedHashMap: (HashMap子類)結合HashMap和TreeMap的優點:有序效率高
應用場景:
快速查詢考慮 HashMap ;
需特定排序考慮 TreeMap ;
僅需要插入順序考慮LinkedhashMap ;
HashMap API ;
三 、相關集合之間的區別
1)List集合:Vector 、ArrayList、LinkedList 對比
-
Vector是矢量隊列,和ArrayList一樣,它也是一個動態數組,由數組實現。但Vector是線程安全的,所以訪問速度上會比ArrayList慢。ArrayList中的操作不是線程安全的,所以在單線程使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。
-
ArrayList是一個數組隊列,相當於 動態數組。實現List接口及繼承AbstractList類。它由數組實現,隨機訪問效率高,隨機插入、隨機刪除效率低。 ArrayList支持序列化,而Vector不支持。
-
LinkedList是實現List接口同時繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。 LinkedList隨機訪問效率低,但隨機插入、隨機刪除效率低。
總結:
-
對於需要快速插入,刪除元素,應該使用LinkedList。
-
對於需要快速隨機訪問元素,應該使用ArrayList。
-
對於“單線程環境” 或者 “多線程環境,但List僅僅只會被單個線程操作”,此時應該使用非同步的類。
2)Map集合:HashMap、Hashtable、TreeMap對比
-
HashMap 是基於“拉鍊法”實現的散列表。一般用於單線程程序中。key、value都可以爲null,且只支持Iterator迭代器遍歷。
-
Hashtable 也是基於“拉鍊法”實現的散列表。它一般用於多線程程序中。 key、value都不可以爲null,支持Iterator與Enumeration枚舉器兩種方式遍歷。
-
TreeMap 是有序的key-value集合,它是通過紅黑樹實現的。它一般用於單線程中存儲有序的映射。
3)Set集合:HashSet、TreeSet 對比
Set集合繼承與Collection接口。是一個不重複元素的集合。
-
HashSet依賴於HashMap(通過HashMap實現的),HashSet中元素是無序的。且允許null元素。
-
TreeSet依賴於TreeMap(通過TreeMap實現的),TreeSet中的元素是有序的。