【面试】HashMap和HashTable的区别

区别

继承的父类不同

image.png

线程安全不同

首先HashMqp是线程不安全的,而HashTable是线程安全的,我们可以查看他的底层源码实现来分析。

首先是HashMap的put方法,就是一个普通的set值的方法。

image.png

然后我们再看HashTable的put方法,我们可以看到,他使用了synchronized关键字来修饰方法,我们知道synchronized是非公平锁,通过锁机制来保证线程安全。

image.png

是否允许为null不同

首先我们来看HashMap它允许你的key和value都为null,程序不会报错。当key为null,则它的hashcode值为0.

image.png

然后我们再来看HashTable,是不允许key或者value为null的,这样输出会报空指针异常。

image.png

输出结果:

image.png

为什么会报空指针异常呢?

我们来追踪一下源码,首先这个put方法一进来就做了value为null的判断,必须保证value不能为null,否则就给你抛出空指针异常。

image.png

另外就是key也不能为null,因为当value不为null时候,他会拿着key去做hashcode值运算,此时key为null,就不能调用这个hashCode()方法了,跟随源码我们可以看到,

image.png

包含的contains方法不同

另外我们在Map中经常使用到key或者value的比较,然而在HashTable中提供了三个方法使用:

Hashtable的contains() 比较的是值,和containsValue()等价,containsKey() 比较的是键。

然而在HashMap中去除了contains(),保留了和containsValue()containsKey()

扩容方式不同

HashMap 扩容必须要求为原容量的2倍。

Hashtable 扩容为原容量2倍加1。

计算hash值的方法不同

HashMap:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
复制代码

Hashtable:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
复制代码

猜你喜欢

转载自juejin.im/post/7110890421735129101