HashSet和HashMap的效能選項

2021-07-27 14:57:00 字數 1092 閱讀 2755

對於hashset及其子類而言,它們採用hash演算法來決定集合中元素的儲存位置,並通過hash演算法來控制集合的大小; 

對於hashmap、hashtable及其子類而言,它們採用hash演算法來覺得map中key的儲存,並通過hash演算法來增加key集合的大小。

hash表裡可以儲存元素的位置被稱為「桶(bucket)」,在通常情況下,單個「桶」裡儲存乙個元素時,此時擁有最好的效能:hash演算法可以根據hashcode值計算出「桶」的儲存位置,接著從「桶」中取出元素。但hash表的狀態是open的:在發生「hash衝突」的情況下,單個桶會儲存多個元素,這些元素以鍊錶形式儲存,必須按順序搜尋。

因為hashset和hashmap、hashtable都使用hash演算法來決定其元素(hashmap則只考慮key)的儲存,因此hashset、hashmap的hash表中包含如下屬性。

除此之外,hash表裡還有乙個「負載極限」是乙個0~1的數值,「負載極限」決定了hash表的最大填滿程式。

當hash表中的負載因子達到指定的「負載極限」時,hash表會自動成倍地增加容量(桶的數量),並將原有的物件重新分配,嵌入新的桶內,這稱為rehashing。

hashset和hashmap、hashtable的構造器允許指定乙個負載極限,hashset和hashmap、hashtable預設的「負載極限」為0.75,這表明當該hash表的3/4已經被填滿時,hash表會發生rehashing。

「負載極限」的預設值(0.75)是時間和空間成本上的一種折中: 

較高的「負載極限」可以降低hash表所占用的記憶體空間,但會增加查詢資料和時間的開銷,而查詢是最頻繁的操作(hashmap的get()和put()方法都要用到查詢); 

較低的「負載極限」會提高查詢資料的效能,但會增加hash表所占用的記憶體開銷。

如果開始就知道hashset和hashmap、hashtable會儲存很多記錄,則可以在建立時就使用較大的初始化容量,如果初始化容量始終大於hashset、hashtable和hashmap所包含的最大記錄數除以「負載極限」,就不會發生rehashing。使用足夠大的初始化容量建立hashset和hashmap、hashtable時,可以更高效地增加記錄,但將初始化容量設定太高會浪費空間,所以不要講初始化容量設定過高。

HashMap和HashSet的區別

hashmap和hashset都是collection框架的一部分,它們讓我們能夠使用物件的集合。collection框架有自己的介面和實現,主要分為set介面,list介面和queue介面。它們有各自的特點,set的集合裡不允許物件有重複的值,list允許有重複,它對集合中的物件進行索引,queu...

hashset和hashmap的區別

map集合,就是有鍵值對的集合,屬性包含key,和value 1.關鍵字key是唯一不重複的 2.map是乙個有序的集合 hashset就像是把hashmap中value去掉 在jcf的所有具體類中,hashset是最簡單的乙個類,該類的例項代表一些唯一元素的普通集 1.無序 2.唯一 3.繼承ab...

hashMap 和 hashSet 的區別 ?

hashmap實現的是map介面 hashset實現的是set介面 hashmap是鍵對值儲存 hashset儲存的僅僅是值 hashmap使用put 存入資料 hashset使用add 存入資料 hashmap效率比較快,因為他是使用唯一的鍵來獲取物件 hashset相對於hashmap來說效率較...