1. 程式人生 > 其它 >List和Set總結

List和Set總結

技術標籤:java集合setarraylist

首先List介面與Set介面都是繼承自Collection介面,

List

list介面的特點是存放的元素 有序且可重複
主要常用實現類有ArrayList,linkedList,vector
ArrayList:

  • 儲存結構:一個Object陣列,採用預設初始化則預設開闢一個空陣列(空陣列new Object { } 不是null陣列)
  • 優缺點:遍歷查詢速度快,支援隨機高效訪問,但是刪除插入速度較慢。
  • 擴容方式:擴容方法grow(); 情況1:當還是空陣列的時候新增第一個元素時會直接擴容長度到10。情況2:當元素已滿時,再向其新增新的元素時,陣列會擴容1.5倍。(擴容後的陣列是擴容前的1.5倍)但是最大容量是 Integer.MAX_VALUE - 8和 Integer.MAX_VALUE (即integer的最大值) 下附原始碼:
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
 private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
            
            //如果需要的最小長度大於了Integer.MAX_VALUE - 8哪麼陣列長度即等於 Integer.MAX_VALUE否則等於Integer.MAX_VALUE - 8
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }

linkedList

  • 儲存結構: 雙向連結串列儲存,(1.6之前是雙向迴圈連結串列,1.7取消了迴圈)
  • 優缺點: 插入刪除速度很快,但是遍歷速度較慢,不支援隨機高效的訪問。
  • 相對於ArrayList而言,LinkedList消耗的空間要比前者多一點,因為Linked list每個元素都會儲存 per(指向前一個元素的指標) item(元素值) next(指向下一個元素)

vector

  • 儲存結構:vector採用object陣列儲存資料,採用預設初始化時會直接指定一個長度為10的陣列,這也是和ArrayList的一個區別。
  • 優缺點: vector因為加上了synchronizaed同步鎖,所以執行緒安全。但是效能會降低一些。
  • 擴容方式:擴容方法grow(); vector正常情況下會擴容到原陣列的二倍,但是如果我們在初始化的時候自己傳入增量,則會按照自己傳入的增量來進行擴容;
    原始碼如下:
 public Vector(int initialCapacity, int capacityIncrement) {
              //初始化陣列長度              //增量
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        //用傳入的增量代替預設的增量
        this.capacityIncrement = capacityIncrement;
    }
    /*******************選取自擴容程式碼grow()*************************/
   int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);
   //新的長度的指定方式。

Set

Set介面的特點是:無序且唯一;
主要的實現類: hashset , linkedhashset, treeset

Hashset : 還是使用hashmap(陣列+連結串列+紅黑樹)實現儲存;其實整個set就是一個"偽裝"的map 哈哈哈

private transient HashMap<E,Object> map;//set介面中宣告的成員變數
 private static final Object PRESENT = new Object();//填充value的object型別元素
  • *儲存結構: set的元素都儲存再hashmap的key上,所以key不重複且無序。而hashmap的value處使用一個object型別的靜態常量來進行填充。
  • hashset可以儲存null值,執行緒不安全;
  • hashset如何識別重複元素: 首先當一個物件加入set中時,會計算物件的hashcode值來判斷物件加入的位置,如果此位置為空,則加入;如果不為空,就依次比較當前位置所在的連結串列,如果連結串列中沒有相同的hashcode,代表不重複,如果有相同的hashcode,就呼叫equals方法檢查內容是否一樣,內容不一樣則新增。

Linkedhashset

  • 儲存結構:(採用linkedhashmap實現)繼承自hashset,且linkedhashset在結構上又加上了連結串列來記錄元素加入的順序,所以集合變成有序的,
  • linkedhashset可以儲存null元素。

treeset

  • 儲存結構:採用treemap(紅黑樹)儲存。是一類有序且可排序的集合,不可儲存null元素,否則丟擲空指標異常;
  • 排序方式兩種:
  •   *第一種:自然排序,集合元素自己實現comparable介面,重寫compareTo方法
    
  •   *第二種:自定義排序,建立set時傳入一個自定義的比較器comparator介面,重寫compare方法,實現自定義排序
    
  • 優點:查詢效率很高;

關於Set的擴容機制就放到Map的總結當中擴充套件,因為Set其本身實現就是一個Map
在這裡插入圖片描述