1. 程式人生 > >JAVA Map、Set、List、Queue、Stack的特點與用法

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。

如果程式在單執行緒環境中,或者訪問僅僅在一個執行緒中進行,考慮非同步的類,其效率較高