HashMap、HashSet、ArrayList實現機制

1.HashMap實現機制:

我們首先看一下什麼是hash算法(摘自百度知道):

這個問題有點難度,不是很好說清楚。 我來做一個比喻吧。 
我們有很多的小豬,每個的體重都不一樣,假設體重分佈比較平均(我們考慮到公斤級別),我們按照體重來分,劃分成100個小豬圈。 
然後把每個小豬,按照體重趕進各自的豬圈裏,記錄檔案。 好了,如果我們要找某個小豬怎麼辦呢?我們需要每個豬圈,每個小豬的比對嗎? 
當然不需要了。 我們先看看要找的這個小豬的體重,然後就找到了對應的豬圈了。 
在這個豬圈裏的小豬的數量就相對很少了。 
我們在這個豬圈裏就可以相對快的找到我們要找到的那個小豬了。 對應於hash算法。 
就是按照hashcode分配不同的豬圈,將hashcode相同的豬放到一個豬圈裏。 
查找的時候,先找到hashcode對應的豬圈,然後在逐個比較裏面的小豬。 所以問題的關鍵就是建造多少個豬圈比較合適。 如果每個小豬的體重全部不同(考慮到毫克級別),每個都建一個豬圈,那麼我們可以最快速度的找到這頭豬。缺點就是,建造那麼多豬圈的費用有點太高了。 如果我們按照10公斤級別進行劃分,那麼建造的豬圈只有幾個吧,那麼每個圈裏的小豬就很多了。我們雖然可以很快的找到豬圈,但從這個豬圈裏逐個確定那頭小豬也是很累的。 所以,好的hashcode,可以根據實際情況,根據具體的需求,在時間成本(更多的豬圈,更快的速度)和空間本(更少的豬圈,更低的空間需求)之間平衡。

瞭解了什麼是hashmap之後,我們看一下java是怎麼實現的:

java是通過組數+鏈實現hashMap的(如果不懂,通過調試查看定義的hashMap裏面的值可以清楚的看懂)

請看下面是hashMap定義的常量

static final int DEFAULT_INITIAL_CAPACITY = 16;//定義初始化有幾個容器(豬圈)
static final float DEFAULT_LOAD_FACTOR = 0.75f;//定義初始化加載因子(意思是當hashMap的個數大於16*0.75的時候,hashMap要再增加容器)
transient Entry[] table;//這個是數組,就是容器(豬圈數組)


存儲:

當我們往HashMapput元素的時候,先根據keyhashCode重新計算hash值,根據hash值得到這個元素在數組中的位置(即下標),如果數組該位置上已經存放有其他元素了,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數組該位置上沒有元素,就直接將該元素放到此數組中的該位置上。(所以整個過程跟value沒多大關係)


2.HashSet的實現機制:

跟hashMap一樣,都是調用hashMap的方法


3.ArrayList的實現機制

其實質就是對數組的操作

定義了兩個變量

private transient Object[] elementData;//數組
private int size;//長度


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章