欢迎光临
我们一起进阶

Java 集合(九):Hashtable

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

Hashtable是原始的java.util的一部分, 是一个Dictionary具体的实现 。

然而,Java 2 重构的Hashtable实现了Map接口,因此,Hashtable现在集成到了集合框架中。它和HashMap类很相似,但是它支持同步。

像HashMap一样,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所限定。

赞(0) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏