java之HashTable
一、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所限定。