1. 程式人生 > >持有對象——Java中的容器(一)

持有對象——Java中的容器(一)

接口 中移動 tex 結構 collect 成對 .get void 概念

  1. 泛型和類型安全的容器
    1. 使用Java SE5之前,編譯器允許向容器中插入不正確的類型,Java SE5引入泛型之後,應用預定義的泛型可以在編譯期防止將錯誤類型的對象放到容器中。
  2. 基本概念
    • Collection。一個獨立元素的序列,這些元素都服從一條或多條規則。List必須按照插入順序保存元素,Set不能保存重復元素,Queue按照排隊規則來確定對象產生的順序(通常與他們插入的順序相同)。
    • Map。一組成對的“鍵值對”對象,允許使用鍵來查找值。其中鍵不能重復,否則鍵對應的值會被覆蓋。
      • HashMap——提供了最快的查找技術,也沒有按照任何明顯的順序來保存元素;
      • TreeMap——按照比較結果的升序來保存鍵;
      • LinkedHashMap——按照插入順序保存鍵,同時還保留了HashMap的查詢速度。
  3. List。List可以將元素維護在特定的序列中。List包含兩個子類:ArrayList和LinkedList。
    • ArrayList——隨機訪問較快,但是在中間插入和移除元素較慢;
    • LinkedList——隨機訪問較慢,但是在List中間插入和移除元素較快,同時提供了優化的順序訪問機制。LinkedList還添加了可使其用作棧、隊列和雙端隊列的方法。
  4. Set。Set不保存重復元素。Set中最長被使用的是測試歸屬性,因此查找成了Set中最重要的操作。Set具有與Collection完全一樣的接口。
    • HashSet——使用了散列,所以HashSet具有較快的查找速度;
    • TreeSet——將元素存儲在紅-黑樹數據結構中,保持一定的順序;
    • LinkedHashSet——也使用了散列,同時使用了鏈表來維護元素的插入順序。
  5. 叠代器——Iterator(只能單向移動)叠代器能夠將遍歷序列的操作與序列底層的結構分離;叠代器統一了對容器的訪問方式。
    • 使用方法iterator()要求容器返回一個Iterator;
    • 使用next()獲取序列中的下一個元素;
    • 使用hasNext()檢查序列中是否還有元素;
    • 使用remove()將叠代器新近返回的元素刪除。
  6. ListIterator——只能用於各種List類的訪問
    • ListIterator可以雙向移動;
    • 它可以產生相對於叠代器在列表中指向的當前位置的前一個和後一個元素的索引,並且可以使用set()方法替換它訪問過的最後一個元素;
    • 通過listIterator()可以產生一個指向List開始處的ListIterator;
    • 通過listIterator(n)可以產生一個指向List列表索引為n的元素處的ListIterator。
  7. Stack——“棧”通常是指“後進先出”(LIFO)的容器
    • 由於LInkedList具有能夠直接實現棧的所有功能的方法,因此可以直接將LinkedList作為棧使用。
    • 但是如果只是想使用棧的功能,最好能組合LinkedList實現而不是繼承或直接用LinkedList代替,避免引入LinkedList的其他方法(Java1.0設計就犯了這個錯誤)

public class Stack<T> {
  private LinkedList<T> storage = new LinkedList<T>();
  public void push(T v) { storage.addFirst(v); }
  public T peek() { return storage.getFirst(); }
  public T pop() { return storage.removeFirst(); }
  public boolean empty() { return storage.isEmpty(); }
  public String toString() { return storage.toString(); }
}

  1. Queue——隊列是一個典型的先進先出(FIFO)的容器(隊列在並發編程中特別重要)。
    • LinkedList提供了方法支持隊列的行為,並且實現了Queue接口,因此是Queue的一種實現;
    • offer():在隊尾插入元素;
    • peek()和element()都將在不移除的情況下返回隊頭;
    • poll()和remove()方法將移除並返回隊頭;
    • 區別在於當隊列為空時,peek()和poll()返回null,而element()和removed()會拋出NoSuchElementException異常。
  2. PriorityQueue——可排序隊列
    • PriorityQueue默認的排序將使用對象在隊列中的自然順序,但你可以通過提供自己的Comparator來修改順序。
  3. Collection和Iterator(略)
  4. Foreach與叠代器
    • foreach語法主要用於數組,但也可以應用於任何Collection對象。之所以如此,是因為Java SE5引入了Iterable接口,該接口包含一個iterator()方法能產生Iterator對象,並且Iterable接口被foreach用來在序列中移動,因此你創建任何實現Iterable的類,都可以使用foreach語句。

持有對象——Java中的容器(一)