JAVA Map、Set、List、Queue、Stack的特點與用法
https://github.com/helen-x/AndroidInterview/blob/master/java/%5BJava%5D%20Map%E3%80%81Set%E3%80%81List%E3%80%81Queue%E3%80%81Stack%E7%9A%84%E7%89%B9%E7%82%B9%E4%B8%8E%E7%94%A8%E6%B3%95.md
- Map
鍵對映到值的物件。一個對映不能包含重複的鍵;每個鍵最多隻能對映到一個值。
某些對映實現可明確保證其順序,如 TreeMap 類;另一些對映實現則不保證順序,如 HashMap 類。
Map中元素,可以將key序列、value序列單獨抽取出來。
使用keySet()抽取key序列,將map中的所有keys生成一個Set。
使用values()抽取value序列,將map中的所有values生成一個Collection。
為什麼一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重複。
- Set
一個不包含重複元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素。
不可隨機訪問包含的元素
只能用Iterator實現單向遍歷
Set 沒有同步方法
- List
可隨機訪問包含的元素
元素是有序的
可在任意位置增、刪元素
不管訪問多少次,元素位置不變
允許重複元素
用Iterator實現單向遍歷,也可用ListIterator實現雙向遍歷
- Queue
先進先出
Queue使用時要儘量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來獲取並移出元素。它們的優點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會丟擲異常。 如果要使用前端而不移出該元素,使用element()或者peek()方法。
值得注意的是LinkedList類實現了Queue介面,因此我們可以把LinkedList當成Queue來用。Queue 實現通常不允許插入 null 元素,儘管某些實現(如 LinkedList)並不禁止插入 null。即使在允許 null 的實現中,也不應該將 null 插入到 Queue 中,因為 null 也用作 poll 方法的一個特殊返回值,表明佇列不包含元素。
- Stack
後進先出
Stack繼承自Vector(可增長的物件陣列),也是同步的
它通過五個操作對類 Vector 進行了擴充套件 ,允許將向量視為堆疊。它提供了通常的 push 和 pop 操作,以及取堆疊頂點的 peek 方法、測試堆疊是否為空的 empty 方法、在堆疊中查詢項並確定到堆疊頂距離的 search 方法。
- 用法
如果涉及到堆疊、佇列等操作,應該考慮用List;
對於需要快速插入,刪除元素,應該使用LinkedList;
如果需要快速隨機訪問元素,應該使用ArrayList。
如果程式在單執行緒環境中,或者訪問僅僅在一個執行緒中進行,考慮非同步的類,其效率較高