一、HashTable
1.1基本數據結構
首先根據上圖,並結合代碼,來看一下HashTable的基本數據結構:
根據代碼,可以看出HashTable是一個Entry<>的數組,那Entry又是什么呢?HashTable中的Entry是HashTable.class的一個內部類,來看一下源代碼:
這里,我們關注它的四個字段,hash、key、value、next。這里的hash也就是之所以叫Hashtable的原因之一。這個hash數值是根據特定的hash算法得出的,詳細內容可以找相應的hash算法資料,這里就不介紹了。接下來說,next字段,next字段是當hash產生重復的時候,以鏈表保存新傳入的hash值對應的key和value。根據Entry的注釋可以很容易明白,這里的Enrty是當發生hash碰撞時的list元素。
1.2 構造方法
以上是源碼中的三個構造方法(還有一個是clone的構造方法)。可以在上圖中看到,如果不指定initialCapacity和loadFactor,默認為11和0.75。
到這里,可能又有人要問,initialCapacity和loadFactor是什么。從上圖的構造方法一中,可以清楚的看到,initialCapacity為初始化Entry[]數組的大小,而loadFactor用來參與計算一個閾值。這個閾值是后面為HashTable擴容使用的,當HashTable中的所有Entry的個數大於閾值時,HashTable即進行擴容。具體代碼會在后面put方法中給出。
1.3 主要方法(put && remove)
put:
以上就是put方法的主體,值得注意的是,該方法被關鍵字sychronized所限定。從for循環中可以看到,如果有put相同的值,原有的值會被覆蓋。
這一段是addEntry方法,從if語句中可以看到,如果count值大於閾值(count值為HashTable中所有Entry的值),則進行rehash(),rehash()的代碼在下面給出,其主要工作就是對原HashTable進行擴容,並且對其中的原有的Entry重新hash。擴容后新的Entry[]大小為原Entry[]大小的2倍+1。
remove:
邏輯和put的差不多。就是找到對應的項,然后做操作。這里,remove方法仍然是被關鍵字sychronized所限定。