關於集合的總結

2021-08-18 13:51:29 字數 1956 閱讀 6517

treemap基於紅黑樹(二叉平衡樹加二叉搜尋樹)。

treemap各項操作時間複雜度是o(logn)。

treemap的key必須實現compareable或者傳入comparable。

遍歷得到的結果是有序的(中序遍歷)。

hashmap的基礎是乙個entry陣列。

entry物件是hashmap的基本元素。同時entry中有next屬性,因此entry也是乙個鍊錶。

hashmap中的entry陣列有預設的長度和裝載因子,預設長度為16,裝載因子為0.75。也就是說預設情況下當entry陣列的長度超過16*0.75後hashmap會執行擴容操作,容量會擴大為原來的兩倍。擴容操作非常耗時,應該盡量避免。

hashmap雜湊的方法是:根據key獲取乙個hashcode,用這個hashcode和陣列長度做取餘運算,得到乙個下標,這個下標就是存放當前entry的下標。

當不同的key計算出相同的下標時代表發生雜湊衝突,這時entry以鍊錶的方式存放。

linkedhashmap繼承自hashmap。

linkedhashmap擁有hashmap大多數特性,比如預設容量16,裝載因子0.75。

linkedhashmap內部維護了乙個雙向鍊錶,並且迭代的時候遍歷的是鍊錶而不是hash表。

linkedhashmap有乙個accessorder屬性,當設定該屬性為true時,插入和取出entry時會把元素移到鍊錶尾,可以用此來實現最近最少使用的快取策略。

hashtable與hashmap類似。內部都維護了hash表,用鏈位址法解決雜湊衝突。

hashtable預設容量為11,裝載因子為0.75。

hashtable容量可以是任意值,而hashmap只能是2^n。

hashtable執行緒安全。

hashtable擴容為原來的2倍+2。

hashmap計算索引的方式是h&(length-1),而hashtable用的是模運算,效率上是低於hashmap的。

hashtable不允許鍵和值為null。

用於高併發的執行緒安全map,其底層和hashmap類似。

對於乙個key,先進行一次hash操作,得到hash值h1,也即h1 = hash1(key);

將得到的h1的高幾位進行第二次hash,得到hash值h2,也即h2 = hash2(h1高幾位),通過h2能夠確定該元素的放在哪個segment;

將得到的h1進行第三次hash,得到hash值h3,也即h3 = hash3(h1),通過h3能夠確定該元素放置在哪個hashentry。

我的理解就是segment加上hashmap組成concurrenthashmap。其中segment是rentrentlock的子類,是可以加鎖的。

預設segment數量是16。可以理解為併發度。

concurrenthashmap是弱一致性的,有時put之後不能立即對get可見。

arraylist的基礎是乙個object陣列。

arraylist的預設長度為10。擴容時擴大的容量是當前容量的1.5倍。

arraylist的向指定位置新增/刪除元素是通過複製陣列來實現的。

讀寫分離來實現執行緒安全。

讀操作不加鎖,寫操作加鎖。

進行寫操作的時候先複製原陣列,然後對陣列進行寫操作,寫完後array指向新的陣列。

比較浪費記憶體。

vector和arraylist類似,初始容量都是10。

vector擴容時在原容量的基礎上加上裝載量,若沒有指定裝載量,則擴容為原容量的2倍。

vector執行緒安全但效率較低。

stack繼承自vector,並擁有棧的特性。stack也是執行緒安全的。

linkedlist內部通過雙向鍊錶實現。

linkedlist插入方便,查詢費時(查詢做了優化,判斷位置在鍊錶前半部分還是後半部分)。

linkedlist實現了deque介面,可以當成棧、佇列、雙端佇列來使用。

集合 Collection集合總結

list有序,可重複 abstractlist 父類abstractcollection抽象類,實現了list介面 arraylist 父類abstractlist 底層資料結構是陣列,查詢快,增刪慢。執行緒不安全,不同步,效率高 vector 父類abstractlist 底層資料結構是陣列,查詢...

關於集合的拷貝

昨天遇到的了乙個問題,就是說,我把一些經常使用很少更新的資料放到乙個靜態變數中,在取值的使用直接賦值,由於賦值後的字段需要進行刪除資料,結果發現執行一段時間之後發現,集合為空了,經查詢發現原來物件的賦值是引用,如果操作這個引用物件就是對那個靜態變數做操作。如何解決這個問題哪?乙個方式就是在需要這個靜...

關於集合的排序

場景 從mongo庫查詢不同表的時間字段,獲取所有年份,按照從大到小排序,並去除重複年份 挖坑過程 1.首先想到treeset集合的特性,int自然序列排序,去重,試了一試發現是順序排列 由於懶放棄了自己寫比較器。2.然後想到用sql降序排好序,在利用set集合的去重機制,利用linkedhashs...