订阅博客
收藏博客
微博分享
QQ空间分享

homemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠

频道:社会资讯 标签:红歌方寸法神 时间:2019年11月01日 浏览:271次 评论:0条

Hashtable也算是集合系列中上海买房条件一个比较重要的集合类了,不过在介绍Hashtable的时候,总是不可避免的谈到HashMa史玉柱p,在面试的时候Hashtable往往也会潇洒走一回结合HashMap一块来问。这篇文章就来好好地分析一下Hashtable

一、认识Hashtable

1、继承关系

为了能好好的理解Hashtable,我们先看一下他在整个集合体系中的位置:

从上面的图我们会发现,Hashta粟米忌廉汤ble和Hashhomemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠Map师出同门,不过这张图太宏观,我们还是放小了看:

这张图已经鞋子品牌很清晰了,继承了Dictionary,实现了Map接口。

2、与HashMap的区别

如果你之前看过我写的那篇HashMap文章的话,在这里对他们俩的区别一定有了解,现在我们对其进行一个整理(这里只看区别):

(1)HashMap允许key和valu追凶者也e为空,但是Hashtable不允许。

(2)Hashtable是线程安全的,HashMap不是线程安全。

(3)ashtable继承自Dictionary,HashMap继承自AbstractMap。

(4)迭代器不同,Hashtable是enumer幕布ator迭代器,HashMap是Iterator迭代器。

3、Hashtablehomemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠基本使用

下面我们就通过源码来分析一下Hashtable。

二、源码分析

对于集合类的源码分析,一般都是从参数、构造方法、还有增删改查的基础上进行分析,然后就是增加元素,增多了怎么处理。删除元素,删多了怎么办等等。下面我们就按照这个思路一步一步分析:

1、参数

Ha黄菊shTable的底层采用"拉链法"哈希表,并且提供了5个主要的参数:

(1)table:为一个Entry[]数组类型,Entry代表了“拉链”的节点,每一个Entry代表了一个键值对。

(2)count:容器中包含Entry键值对的数量。

(3)threshold:阈值,大于这个阈值时需要调整容器容量。值="容量*加载因子"。

(4)loadFactor:加载因子。这个比较重要。

(5)modCount:用来实现“fail-fast”机制包商银行的。对容器任何增删改操作孕妇能吃菠萝吗都会修改modCount。如果出错立即抛出Concu种子基地rrentModificationException异常。

上面的是源码,你会发现table、counthomemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠、modCount还都是transient修饰的,这也就意味着这三个参数是不能被系列化的。

2、构造方法

下面我们看看其构造方法,源码中一共提供了4个构造方法:

(1)构造宝马335i方法1

(2)构造方法2

(3)构造方法3

这个构造方法首先排除掉一些异常情况,然后新建一个table数组来装数据。

(4)构造方法4

这个构造方法我们可就要稍微注意了,真正实现这个操作的是putAll(t)homemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠。想要弄清楚我们不妨跟进去看看。

上面的代码使用了泛型,而且还是泛型通配符,不过意思很明确,就是通过for循环一个一个转移到新的map中。

以上所述就是我叫白小飞整个构造方法的机制。

3、增加一个元素

这些代码第一部分和飞车第二部分都是为了没有异宫心计常,如果当前容器有这个key,那么直接以新值代替旧值即可,最主要的还是第三部分,添加一个元素的核心addEntry方法。进去看看:

上面的这些代码的大致意思就是如果容器里面没有满,那就新建一个Entry根据hash值插入到指定位置。而且一开始还提供了modCount确保安全(快速失败机制)。如何去扩容呢?下面我们接着讲。

2、扩容

扩容就是当容器中放满了,需要把容器扩大。我们看看这个rehash是如何扩容的。

上面代码的注释已经很清楚了,不过上面相信你会有一个疑问,不管是put一个元素还是扩容,在计算hash的时候都出现了(e.hash & 0x7FFFFFFF)homemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠 ,它的作用是什么呢?

你可以这样理解,hash值是int类型,而且一定是正数,疱疹性咽峡炎和0x7FFFFFFF做与操作即是将负数变成正数,确保了获取到的index是正数。

3、删除一个元素

删除一个元素就比较简单,核心就是通过key计算在容器中的位置,然后把这个位置上的Entry删除即可。由于使用的链表删除起来会更简单。将前一个元素指针直接指向下一个元素,跳过当前元素e.next。

4、查询一个元素

这个就太简单了,通过key计算hash值找到位置,直接通过e.value获取值即可。

5、迭代器

与HashMap不同的是,它的迭代器是Enumeration。在这里我们不会讲解Enumeration,只是给出其基本homemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠的使用方法,因为Enumeration我会在专门的文章里面会介绍。这里就不再重复了。

这就亚洲热是一个最简单的使用八戒电影方法,

6、其他方法

这个方法是判断这个容器中是否有value这个值,判断的方法homemade,Hashtable源码剖析(jdk1.8,强烈推荐),七龙珠特别死板,就是通过for循环一个一个比较。

三、总结

说实话这个Hashtable使用的场景还是很局限的,所以一般情况下基本上不会用到,不拘一格降人才不管是效率还是空间特性。因为上面的增删改查方法你会发现,全是一个一个比对的,对于数据量大的时候这是非常耗时的,而且存储空间也是采用的链表。

一般来说非并发场景使用HashMap,并发场景可以使用Hashtable,但是推荐使用ConcurrentHashMap,因为它锁粒度更低、效率更高。

Hashtable往往会结合者HashMap来出问题,希望大家注意,最核心的还是HashMap。