資料結構 集合

2021-09-11 08:56:40 字數 3045 閱讀 1040

陣列:陣列長度在初始化的時候就已經固定,不適合物件數量未知的情況。

下圖為collection(**於的部落格)

下圖為map(**於網路)

1.介紹一下list比較常用的集合:(有序,值允許重複)

1)arraylist:

底層實現:

private static final object defaultcapacity_empty_elementdata = {};

transient object elementdata; // non-private to simplify nested class access

public arraylist()

初始化方法初始化了乙個陣列,底層實現為陣列。既然是陣列,了解下如何實現陣列長度的自動化增長。

int newcapacity = oldcapacity + (oldcapacity >> 1);
最關鍵的一句**,差不多就是一次增加原有長度的一半,當然還有其他特殊情況的處理,就不詳細說了。

特點:末尾新增/刪除資料時速度較快,向中間set/remove資料較慢,隨機查詢效率很高(因為有索引)。

2)linkedlist:

底層實現:

private static class node

}

從上圖可以看出來是鍊錶,因為有next和prev所以是雙向鍊錶。

下面是remove方法的實現**

public int indexof(object o) 

} else

}return -1;

}

用遍歷來實現,效率肯定低,資料越多效率越低。

3)vector

底層實現:和arraylist一樣是陣列,不過vector所有方法上都有synchronized保證其執行緒安全。

特點:執行緒安全,效率低。

2.簡單介紹下set:(hashset無序,不允許有重複值)

hashset:基於hashmap實現,只儲存值,沒有key(map中key的位置放置值,value位置放置乙個new object())

hashset與hashmap的區別:hashmap中keys的元素有校驗重複,所以hashset中儲存的物件都會先校驗下hashcode。

linkedhashset:基於linkedhashmap實現,保證了元素的有序。

treeset:基於treemap實現,保證有序。

3.簡單介紹下queue:

deque:雙向佇列,deque是個介面,實現類有arraydeque(底層實現為陣列),linkeddeque(底層實現為鍊錶)。總體來說,arraydeque要比linkeddeque效能高。

priorityqueue:優先順序佇列,底層實現也是陣列,優先順序排序,需要實現comparator(排序方法暫未了解)。

4.另乙個基本介面map

1)hashmap:底層實現為雜湊表,所以儲存陣列不能保證有序。原始碼如下:

transient node table;
在呼叫put方法時,會判斷table是否為null,如果為null則進行初始化。下邊是預設初始化大小:

static final int default_initial_capacity = 1 << 4; // aka 16
當每次陣列存滿時,當前陣列容量小於最大數量(2^30)並且大於初始化容量時,陣列容量*2,增加的量如下:

if (oldcap > 0) 

else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}

hashmap的keys不允許有重複,可以為null,利用hashcode校驗keys是否重複,**如下;

static final int hash(object key)
2)hashtablehashtable在hashmap的基礎上所有方法都加上了synchronized關鍵字。並且在讀寫操作中限制了key不能為null,否則丟擲空指標異常。

3)linkedhashmap

static class entryextends hashmap.node

}

4)treemap基於紅黑樹實現的,該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的 comparator 進行排序。不能夠記錄存入順序。

紅黑樹屬於平衡二叉樹的一種,資料在存入的時候,會根據資料大小進行排序,即左子節點《根節點《右子節點,所以在查詢元素的時候,可以直接和根節點進行比較,如果小於根節點,則向左查詢,如果大於根節點,則向右查詢,所以查詢效率比較高。下邊是紅黑樹的乙個圖:

(**於:

關於紅黑樹的右旋和左旋,請移步至:

資料結構 集合

乙個識別符號 集合set 可以儲存多個資料,資料不能重複。集合與陣列的區別,集合的內容具有唯一性 全等匹配 宣告集合 let f70 newset f71 集合賦值 let f71 let f70 newset f71 集合賦值 f70.add 1 f70 add 2 f70.add 1 f70 a...

集合和資料結構

類似的資料在作為集合而儲存和操作時通常可以得到更高效地處理。可使用 system.array 類或 system.collections system.collections.generic system.collections.concurrent 和 system.collections.imm...

資料結構 集合類

2 linkedlist 3 hashmap 4 hashtable arraylist初始長度為0,當第一次呼叫add後,長度變為10,當陣列首次擴容的10個空間用完需要擴容後,會第二次走grow方法來擴容 每次擴容為1.5倍 它的底層是用陣列實現的,所以查詢速度相對linkedlist要快。li...