Collection<E>/集合
Collection與Collections
- Collection是所有集合類的根接口;
- Collections是提供集合操作的工具類;
集合類和數組不同,
- 數組元素可以為基本數據類型值/對象引用;
- 集合元素只能為對象引用;
Java的集合類由Collection接口和Map接口派生,
- Set代表無序集合,無序不可重復;
- List代表有序集合,有序可重復;
- Map集合存儲鍵值對;


toArray(T[] array)/集合轉數組
<T> T[] toArray(T[] a);
集合轉數組時,必須使collection的toArray(T[] array)方法,傳入類型完全一樣的數組,大小應為list.size();

直接使用toArray無參方法,返回值只能是Object[]類,進行類型強轉會出現ClassCastException錯誤;
Iterator<E>/迭代器
public interface Iterable<E> { // Iterable泛型接口
Iterator<E> iterator(); // 由繼承接口的集合類負責實現,返回一個迭代器
}
Iterator用於遍歷/迭代訪問集合中的元素,
只能單向移動;
Iterator遍歷方式一:
Iterator it = CollectionInstance.iterator(); // Iterator應與指定集合綁定
while(it.hasNext()) // 如果集合尚未迭代完畢,返回ture
{
collectionElementType cet = (collectionElementType)it.next();
// next()方法返回集合下一個元素it.remove();
// remove()方法刪除上一次調用next方法返回的集元素}
Iterator遍歷方式二:
// foreach循環遍歷
for(CollectionType obj : Collection) {
...
}
Set<E>/無序集合/集
Set集合中對象不可重復,因此當試圖添加兩個相同元素時,add()方法返回false/元素不可加入;
Set集合中對象
必須重寫hashCode()方法和equals()方法;
HashSet<E>/散列集
按照Hash算法存儲結合元素
—>具有良好的存取/查找性能;
- 添加元素時,調用hashCode()方法計算對象的hashCode值;
- 根據hashCode值決定對象的存儲位置—>元素存儲順序和添加順序可能不一致(LinkedHashSet可保證);
- HashSet判斷元素相等的標准:equal()方法相等/hashCode()方法返回值相同;
- Hash算法/哈希/散列:通過計算元素的hashCode值獲取元素的存儲位置—>價值在於存取/查找速度快
- 與數組相比,HashSet索引不需要連續,可自由增加HashSet長度;
LinkedHashSet<E>
HashSet的子類
,LinkedHashSet也是根據元素的hashCode值決定其存儲位置;
同時使用鏈表維護元素的添加次序—>性能略低於HashSet的性能;
TreeSet<E>/樹集
TreeSet實現SortSet接口,
TreeSet采用紅黑樹(red-black tree)存儲集合元素,
排序規則支持自然排序/定制排序;
TreeSet存儲對象必須實現Comparable接口;
List<E>/列表
Java中所有鏈表底層都是雙向鏈接(doubly linked);
List額外提供listIterator()方法,該方法返回一個ListIterator對象,用於遍歷
List;
ListIterator的set(obj)方法用新元素obj覆蓋next()/previous()返回的上一個元素,可以雙向移動;
ListIteritor lit = listInstance.listIterator();
// 正向順序迭代List
while(lit.hasNext())
{
System.out.println(lit.next());
}
// 反向逆序迭代List
while(lit.hasPrevious())
{
System.out.println(lit.previous());
}
ArrayList<E>/數組列表
ArrayList底層有數組支持,通常作為默認首選;當程序頻繁進行插入/刪除操作時,選用LinkedLIst;如果元素數量固定,可選擇真正數組/List/備選;
ArrayList/Vector辨析
—>ArrayList與Vector用法幾乎相同,
JDK1.0推出
Vector/JDK2.0將Vector改為實現List接口;
—>Vector缺點較多,盡量避免使用;
—>Vector是線程安全的,但是Collections工具類可使得ArrayList線程安全;
—>Vector擁有子類Stack,性能較差,可用ArrayDeque替代;
LinkedList<E>/鏈表實現/雙端隊列實現
LinkedList
底層由雙向鏈表實現,執行插入/刪除操作時性能較好,避免使用get(index)遍歷LinkedList(隨機查找時均從頭開始查找,性能低下);
- 實現List接口。可根據索引隨機訪問集合元素(ArrayDeque不支持);
- 實現Deque接口。可當作雙向隊列使用—>可實現"棧"/普通隊列;
Queue<E>/隊列
Queue接口中定義的主要方法:

// 入隊
boolean add(Object e): 入隊/成功返回true/失敗拋出IllegalStateException
boolean offer(Object e):入隊/失敗返回false/適用於固定容量的隊列
// 獲取隊首
Object peek(): 獲取隊首/不刪除/隊列為空返回null值
Object element(): 獲取隊首/不刪除/隊列為空拋出異常
- // 彈出隊首
Object poll(): 彈出隊首/隊列為空返回null值
Object remove(): 彈出隊首/隊列為空拋出異常
Deque接口/雙端隊列
Deque接口是Queue接口的子接口,表示
雙向隊列;

Deque接口定義的部分雙向隊列操作,
部分方法可模擬“棧”的實現/Java中已集成操作棧方法:
- "push":添加元素到隊首,addFirst(e);
- "pop":彈出隊首元素,removeFirst();
- "peek":獲取棧頂,peekFirst();
ArrayDeque<E>/棧實現/Deque實現
ArrayDeque
實現“棧”,LIFO(后入先出):

ArrayDeque
實現普通隊列,FIFO(先入先出):

PriorityQueue<E>/優先隊列
PQ采用堆結構實現,不允許插入null元素,有自然排序和定制排序兩種方式,
使用時再補充:
Map/字典/關聯數組/映射表
Map用於保存具有映射關系的數據;
key和value可以為任何引用類型,Map通過key索引/操作value,如果自定義對象作為Map的鍵,該對象必須重寫hashCode和equals(鍵的唯一性);
key不可重復,並且同一個key只索引一個value ;
key不可重復,並且同一個key只索引一個value ;
- Set<K> keySet():獲取Map的鍵集,從鍵集中進行一次刪除鍵操作,等價於從Map中刪除對應鍵值對;
- Collection<K> values():獲取Map的值集合,從值集合中進行一次刪除值操作,等價於從Map中刪除對應一項鍵值對;
- Set<Map.Entry<K, V>> entrySet():獲取Map的鍵/值對集,Entry<K, V>表示一對鍵值對,是靜態內部類Map.Entry對象;
遍歷Map

KeySet()遍歷實質:遍歷兩次,第一次轉為Iterator對象,第二次從Map中去除key對應的value;
entrySet()遍歷實質:只遍歷一次就把K,V放入entry中,效率較KeySet()更高;
Map各實現類性能比較
- HashMap為快速查詢而設計,HashMap通常比Hashtable快,一般應多采用HashMap;
- TreeMap為排序而設計,TreeMap通常比HashMap慢;
- LinkedHashMap維護鍵值對添加順序,LinkedHashMap比HashMap較慢;
HashMap/散列映射表
Hashmap對key進行散列
HashMap與Hashtable
HashMap允許key為null值/最多只有一個,value值可為null/不限制;
與Vector類似,
Hashtable類推出較早,盡量避免使用—>Collections工具類可使得HashMap線程安全;
HashMap判斷兩個key相等的標准—>equals()方法返回true/兩個key的hashCode值相等;
判斷兩個value相等的標准—>equals()方法返回true;
—>使用自定義類作為key值時,重寫equals方法/hashCode方法時—>應使equals()返回true時,hashCode()返回值也相同;
LinkedHashMap/鏈式散列映射表
LinkedHashMap使用
雙向鏈表維護鍵值對的插入順序,性能略低於HashMap;
IdentityHashMap/標識散列映射表
IdentityHashMap中,鍵的散列值(hashCode)不通過ashCode()方法計算,通過Sytem.identityHashCode()方法計算;
進行對象比較時,
IdentityHashMap類使用“==”判斷,不使用equals()方法;
WeakHashMap/弱散列映射
WeakHashMap的鍵為弱引用/WeakReference,回收后自動刪除對應鍵值對;
TreeMap/樹映射表
TreeMap根據key的整體順序對元素進行排序,組織成紅黑樹形式;