Java集合類(十一)Map總結

2021-08-14 09:30:22 字數 1353 閱讀 2984

面試時考官會問,兩個使用相近類的異同,比如hashmap,hashtable。那我們總那幾方面回答呢?

1.繼承的類

2.底層使用的資料結構

3.執行緒安全性

首先我們這樣假設,假設雜湊對映的內部陣列的大小只有1,所有的元素都將對映該位置(0),從而構成一條較長的鍊錶。由於我們更新、訪問都要對這條鍊錶進行線性搜尋,這樣勢必會降低效率。我們假設,如果存在乙個非常大陣列,每個位置鍊錶處都只有乙個元素,在進行訪問時計算其 index 值就會獲得該物件,這樣做雖然會提高我們搜尋的效率,但是它浪費了控制項。誠然,雖然這兩種方式都是極端的,但是它給我們提供了一種優化思路:使用乙個較大的陣列讓元素能夠均勻分布。在map有兩個會影響到其效率,一是容器的初始化大小、二是負載因子。

在雜湊對映表中,內部陣列中的每個位置稱作「儲存桶」(bucket),而可用的儲存桶數(即內部陣列的大小)稱作容量 (capacity),我們為了使map物件能夠有效地處理任意數的元素,將map設計成可以調整自身的大小。我們知道當map中的元素達到一定量的時候就會調整容器自身的大小,但是這個調整大小的過程其開銷是非常大的。調整大小需要將原來所有的元素插入到新陣列中。我們知道index = hash(key) % length。這樣可能會導致原先衝突的鍵不在衝突,不衝突的鍵現在衝突的,重新計算、調整、插入的過程開銷是非常大的,效率也比較低下。所以,如果我們開始知道map的預期大小值,將map調整的足夠大,則可以大大減少甚至不需要重新調整大小,這很有可能會提高速度。

為了確認何時需要調整map容器,map使用了乙個額外的引數並且粗略計算儲存容器的密度。在map調整大小之前,使用」負載因子」來指示map將會承擔的「負載量」,也就是它的負載程度,當容器中元素的數量達到了這個「負載量」,則map將會進行擴容操作。負載因子、容量、map大小之間的關係如下:負載因子 * 容量 > map大小 —–>調整map大小。

例如:如果負載因子大小為0.75(hashmap的預設值),預設容量為11,則 11 * 0.75 = 8.25 = 8,所以當我們容器中插入第八個元素的時候,map就會調整大小。

負載因子本身就是在控制項和時間之間的折衷。當我使用較小的負載因子時,雖然降低了衝突的可能性,使得單個鍊錶的長度減小了,加快了訪問和更新的速度,但是它占用了更多的控制項,使得陣列中的大部分控制項沒有得到利用,元素分布比較稀疏,同時由於map頻繁的調整大小,可能會降低效能。但是如果負載因子過大,會使得元素分布比較緊湊,導致產生衝突的可能性加大,從而訪問、更新速度較慢。所以我們一般推薦不更改負載因子的值,採用預設值0.75.

Java集合類框架 Map

如果是實現了map介面的集合類,具備的特點 儲存的資料都是以鍵值對的形式存在的,鍵不可重複,值可以重複。map介面的方法 新增 put k key,v value putall map extends k,extends v m 刪除 remove object key clear 獲取 get o...

Java集合 Map集合

map map 用於儲存具有對映關係的資料,因此 map 集合裡儲存著兩組值,一組值用於儲存 map 裡的 key,另外一組用於儲存 map 裡的 value map 中的 key 和 value 都可以是任何引用型別的資料 map 中的 key 不允許重複,即同乙個 map 物件的任何兩個 key...

JAVA集合類總結

所有的集合類都是先iterator介面,意味著所有的集合類都是可以迭代輸出的。以collection為介面的元素集合型別,以map為介面的對映集合型別 所有集合的實現類都不是直接實現集合類介面,而是都繼承乙個相應的抽象類。list list介面提供了多個實現的子類,其實現類有arraylist,li...