hashmap,linkedmap,treemap的區別
priorityqueue 保證最高或者最低優先順序的的元素總是在佇列頭部,但是 linkedhashmap 維持的順序是元素插入的順序。
linkedhashmap是hashmap的子類。
hashmap的put方法會引起死迴圈,讓cpu的利用率達到100%
treemap是已經排序好了,而hashmap是沒有排序的,
如果要按值排序可以如下:
publicclass
maputil
} );
mapresult = new linkedhashmap();
for (map.entryentry : list)
return
result;
}}
1.hashmap的內部結構是乙個陣列,線性順序儲存,二次結構使用線性的單鏈表。使用key的hashcode做二次hash之後,再擷取小於陣列長度的值為索引值。key可以為null,存在索引為0的位置上。由於使用了陣列,所以有乙個負載因子loadfactor的概念(臨界閾值threshold)和resize。resize比較耗時,衝突時鏈式遍歷查詢也比較耗時,所以選定乙個合適的初始容易比較重要。訪問效能都較高。迭代遍歷時一維使用陣列,二維使用鍊錶。【這種資料結構的設計模式】
hashmap是乙個最常用的map,它根據鍵的hashcode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。hashmap最多隻允許一條記錄的鍵為null;允許多條記錄的值為 null;
2.linkedhashmap是hashmap的子類。內部結構是乙個陣列,線性順序儲存,二次結構使用線性的單鏈表,但同時內部維護了乙個雙向迴圈鍊錶,可以保持順序。access-order=false預設為使用新增儲存順序,access-order=true則指定使用讀取和訪問順序。removeeldestentry=false(當指定為true時,就是實現lru演算法的快取容器,當然要指定淘汰時的使用頻率和容量上限,其實是乙個最近最少使用-->最近使用access-order=true/最新儲存access-order=false)。訪問效能較hashmap差-些,但相差不大。header.after為尾方向,header.before為首方向。迭代遍歷時entryset().iterator()跟hashmap一樣(有點困惑,為什麼不按線性順序進行迭代,只能重寫entryset(),keyset()和values()方法)。適用於有快取設計需求的情況(需繼承)。
3.treemap的內部結構是一棵紅黑樹(又叫排序數,是二叉樹的一種),使用鏈式儲存,可以指定比較器comparator,key需實現comparable介面。key不能為null。存結點效能稍差,因為需要調整樹結構;取結點用的是鍊錶遍歷,但是屬於有序比較,效能中等。迭代遍歷時用的樹的中序遍歷,是乙個有序序列。適用於有排序需求的情況。
如果需要資料進行按照鍵值、或者是value值,則使用treemap
*hashmap*
*hashset*
使用put()方法將元素放入map中
使用add()方法將元素放入set中
hashmap中使用鍵物件來計算hashcode值
hashset使用成員物件來計算hashcode值,對於兩個物件來說hashcode可能相同,所以equals()方法用來判斷物件的相等性,如果兩個物件不同的話,那麼返回false
hashmap比較快,因為是使用唯一的鍵來獲取物件
hashset較hashmap來說比較慢
hashset有以下特點:
a. 無序(不能保證元素的排列順序,順序有可能發生變化)b. 不同步c. 允許空值(集合元素可以是null,可以放入多個null,但會自動覆蓋)
當向hashset結合中存入乙個元素時,hashset會呼叫該物件的hashcode()方法來得到該物件的hashcode值,然後根據 hashcode值來決定該物件在hashset中儲存位置。簡單的說,hashset集合判斷兩個元素相等的標準是兩個物件通過equals方法比較相等,並且兩個物件的hashcode()方法返回值相 等注意,如果要把乙個物件放入hashset中,重寫該物件對應類的equals方法,也應該重寫其hashcode()方法。其規則是如果兩個物件通過equals方法比較返回true時,其hashcode也應該相同。另外,物件中用作equals比較標準的屬性,都應該用來計算 hashcode的值。
treeset有以下特點:
a. 有序
1. treeset是由乙個樹形的結構來實現的(資料結構是二叉樹),它裡面元素是有序的
2.treeset是sortedset介面的唯一實現類,treeset可以確保集合元素處於排序狀 態,支援兩種排序方式,自然排序和定製排序。其中自然排序為預設的排序方式;定製排序,treeset中的物件元素需要實comparable介面
treeset類中跟hashset類一樣也沒有get()方法來獲取列表中的元素,所以也只能通過迭代器方法來獲取
二叉樹:
b. 不允許空值
1. hashset是通過hashmap實現的,treeset是通過treemap實現的,只不過set用的只是map的key【???】
3. treeset類中跟hashset類一樣也沒有get()方法來獲取列表中的元素,所以也只能通過迭代器方法來獲取
4. hashset是基於hash演算法實現的,效能優於treeset,通常使用hashset。在我們需要對其中元素排序的時候才使用treeset。
複雜點:
從weak reference特性來看,肯定是用於監測物件狀態。至於我使用的時候嘛。。很少會直接用到它,大多數時候需要針對執行緒作為鍵進行對映,直接使用threadlocal就好了。
我直接使用好像只有兩次,都是對class物件作為鍵進行對映。由於類載入器的緣故,可能發生class的**,若使用強引用,記憶體開銷可能會太大。
總之,對於那些很可能被**,而且被放置在static欄位裡的物件,就要用weakhashmap
也可以做快取,不過快取還是用softreference比較好,soft reference在記憶體將滿時會丟棄引用。或者過載「刪除第乙個entry」方法(具體是什麼名稱忘記了。。)的linkedhashmap,可以很輕鬆的實現lru。
集合面試指南
hashmap中的key可以是任何物件或資料型別嗎 hashtable是執行緒安全的麼 concurrenthashmap 執行緒安全嗎,concurrenthashmap如何保證 執行緒安全?假設我們現在 hashtable 的容量為 5,已經存在了 5,5 13,13 16,16 17,17 2...
最近碰到的面試 集合(一)
1 collection和collections collection是乙個介面,它提供了集合類的通用方法如size isempty toarray add e 之類的方法 collections是乙個集合包裝類,提供了一系列有關聚合的靜態 static 方法,此方法不能new 因為構造方法是pri...
集合面試題
list,set集合與collection有直接的關係而map屬於間接的關係 list的特點 可以儲存重複的資料,有順序 set的特點 不能儲存重複的資料,沒有順序 map的特點 根據鍵值對保持資料,鍵不可以重複,值可以重複沒有順序 arraylist 優點 查詢速度較快,使用新增和刪除功能較慢 l...