HashMap 和 HashTable 的区别和不同
记得刚毕业那会准备面试,看过不少面试题,里面有个说出 HashMap 和 HashTable 不同的
题目,我那会面试的时候也遇到不少次这个问题,还隐约记得当时的回答是这样的:/
HashTable 是比较旧的版本;HashTable 是线程安全的,而 HashMap 是非线
记得刚毕业那会准备面试,看过不少面试题,里面有个说出 HashMap 和 HashTable 不同的题目,我那
会面试的时候也遇到不少次这个问题,还隐约记得当时的回答是这样的:/
HashTable 是比较旧的版本;HashTable 是线程安全的,而 HashMap 是非线程安全的;HashMap 的
key 和 value 允许 Null 值,还有就是 HashMap 效率要高。好像就这些了吧,当时认识也比较肤浅。
前段时间有空就想起来了这个问题,于是就想深入的理解一下这两个比较常用的数据结构,然后看了一
下这两个类的源码,有了比以前更深入的了解。大体上这两个类内部处理差别不是很大,当然还是有不
少不同,下面我们来一一探讨一下他们之间的不同/
引言:首先来说一下 HashMap 内部其实是一个数组+链表的结构,当你 put
一个元素的时候,HashMap 会根据 Key 的 hash 值算出要存放的数组的位置,如果两个元素算出的数组
值相同的话,那么他们会放在数组里的同一个位置,这个时候在获取该元素的时候,那么会根据 Key 的
hash 找到数组的位置,然后再从链表中找到该元素。那么我们可以很容易的想象到,如果每一个数组里
只有一个元素的时候,效率是最高的,因为不需要再对链表进行操作。有了这点认识我们就可以进行接
下来的分析了。
[list]
[1]数组大小/。/
既然说了内部是数组+链表,那就设计到数组的大小,这一点,HashMap 和 HashTable 是不同的/
HashMap 的默认大小
Java 代码//
static nal int DEFAULT_INITIAL_CAPACITY = 16 ;
static nal int DEFAULT_INITIAL_CAPACITY = 16;
我们看到默认是 16,而且 HashMap 的大小一定是 2 的幂数。这里你可能会问了,如果初始化
HashMap 的时候指定了一个不是 2 的幂数的长度呢?如果是这种情况,它也会找到一个最接近你指定值
的一个 2 的幂数,下面是源码:
Java 代码//
int capacity = 1 ;
while (capacity < initialCapacity)
capacity <<= 1 ;
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
就是他会找到一个比你指定值大且是 2 的幂数的一个值,那么为什么它会这么做呢,这个问题我留到下
面具体说明。/