閱讀534 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java Collections

Java集合類如圖所示

gather


1. Iterator

迭代器接口,是一種設計模式,用來遍曆序列對象。

1.1 ListIterotr

可雙向遍曆。


2. Collection

  • 最基本的集合接口,繼承於Iterator,自身不被直接繼承,兩個子接口List和Set



2.1 List

  • 有序Collection
  • 提供基於索引的隨機訪問,內容可重複。
  • 實現了ListIterator接口,可向前遍曆


2.1.1 ArrayList

  • 可變數組,允許隨機訪問

  • 允許含null,隻能存對象

  • 非同步,線程不安全

  • 有容量Capacity,每次擴充原來的一半。創建ArrayList時最好指定Capacity,提高插入效率。存在空間浪費。

    private void grow(int minCapacity) {
      // overflow-conscious code
      int oldCapacity = elementData.length;
      int newCapacity = oldCapacity + (oldCapacity >> 1);
      if (newCapacity - minCapacity < 0)
          newCapacity = minCapacity;
      if (newCapacity - MAX_ARRAY_SIZE > 0)
          newCapacity = hugeCapacity(minCapacity);
      // minCapacity is usually close to size, so this is a win:
      elementData = Arrays.copyOf(elementData, newCapacity);
    }
    


2.1.2 LinkedList

  • 可變鏈表,允許隨機訪問
  • 允許含null
  • 可雙向遍曆,頭尾操作快,可以用作Stack、Queue、雙向Queue
  • 非同步,線程不安全
  • 比ArrayList更占空間,每個節點存儲兩個引用,分別指向前後元素


2.1.3 Vector

  • 與ArrayList類似。

  • Vector很多方法由synchronized修飾,是同步的,線程安全。

    • 如果遍曆Vector過程中,另一個線程改變了Vector,則會報錯。
  • 擴充容量為原來的一倍,並且可以自己設置擴充因子

    private void grow(int minCapacity) {
      // overflow-conscious code
      int oldCapacity = elementData.length;
      int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                       capacityIncrement : oldCapacity);
      if (newCapacity - minCapacity < 0)
          newCapacity = minCapacity;
      if (newCapacity - MAX_ARRAY_SIZE > 0)
          newCapacity = hugeCapacity(minCapacity);
      elementData = Arrays.copyOf(elementData, newCapacity);
    }
    


2.1.4 Stack

  • 繼承於Vector,Vector的堆棧實現,包括empty、peek、pop、push、search等方法。


2.2 Set

  • 成員不可重複
  • 可以有序


2.2.1 HashSet

  • 基於HashMap,key存值,value存係統默認的Object對象,可快速查找
  • 不保證有序,非同步
  • 成員為Object子類對象
  • 可以放一個null


2.2.2 TreeSet

  • 基於TreeMap,默認有序
  • 自定義對象要實現Comparable接口才能放入TreeSet


2.2.3 LinkedHashSet

  • 在HashSet基礎上,維護一個鏈表來記錄插入順序。這使得它訪問順序比HashSet好,但插入順序相比稍差。


3. Map

鍵值對,鍵不能重複,快速查找


3.1 HashMap

  • 可含有一個key為null的鍵值對
  • 非同步,若讓HashMap同步,使用Collections.synchorniezMap(),
  • 去除了contains方法
  • 擴容為2的冪


3.2 TreeMap

  • 基於紅黑樹,有序
  • 遍曆value時盡量使用entrySet遍曆,這樣防止二次查找(keySet找value極慢)
  • 可以返回一個子樹


3.3 LinkedHashMap

  • HashMap子類,於LinkedHashSet類似,額外添加雙向鏈表來保證順序

最後更新:2017-09-07 10:02:56

  上一篇:go  阿裏雲免費企業郵箱申請流程
  下一篇:go  人工智能時代的產品思維(2C)