【面试】HashMap和HashTable的区别
区别
继承的父类不同
线程安全不同
首先HashMqp是线程不安全的,而HashTable是线程安全的,我们可以查看他的底层源码实现来分析。
首先是HashMap的put方法,就是一个普通的set值的方法。
然后我们再看HashTable的put方法,我们可以看到,他使用了synchronized
关键字来修饰方法,我们知道synchronized
是非公平锁,通过锁机制来保证线程安全。
是否允许为null不同
首先我们来看HashMap它允许你的key和value都为null,程序不会报错。当key为null,则它的hashcode值为0.
然后我们再来看HashTable,是不允许key或者value为null的,这样输出会报空指针异常。
输出结果:
为什么会报空指针异常呢?
我们来追踪一下源码,首先这个put方法一进来就做了value为null的判断,必须保证value不能为null,否则就给你抛出空指针异常。
另外就是key也不能为null,因为当value不为null时候,他会拿着key去做hashcode值运算,此时key为null,就不能调用这个hashCode()方法了,跟随源码我们可以看到,
包含的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;
转载自:https://juejin.cn/post/7110890421735129101