Java面试Day5 - HashMap和Hashtable相关

Java面试Day5 - HashMap和Hashtable相关,第1张

Java面试Day5 - HashMap和Hashtable相关

HashMap和Hashtable相关
      • HashMap和Hashtable的区别
      • JDK7下的CurrentHashMap(线程安全)
      • CurrentHashMap和hashtable的区别

HashMap和Hashtable的区别

1、继承的父类不同
HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable继承自Dictionary类,Dictionary已经废弃。

2、HashMap线程不安全,HashTable线程安全
Hashtable 中的方法大多是Synchronize的,而HashMap中的方法在一般情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。HashTable实现线程安全的代价就是效率变低,因为会锁住整个HashTable,而ConcurrentHashMap做了相关优化,因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定,效率比HashTable高很多。
3、是否允许null值
Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
HashTable键值对都不能为空,否则包空指针异常。

4.解决hash冲突方式不同
hashmap

java8之前 
数组+链表

java8之后 数组+链表+红黑树
1.如果冲突数量小于8,则是以链表方式解决冲突。
2.而当冲突大于等于8时,就会将冲突的Entry转换为 红黑树 进行存储。
3.而又当数量小于6时,则又转化为链表存储。

而在HashTable中, 都是以链表方式存储。

5、HashMap是没有contains方法的,hashtable有

6、计算hash值方式不同

7、扩容方式不同(容量不够)

当容量不足时要进行resize方法,而resize的两个步骤:
①扩容;
②rehash:这里HashMap和HashTable都会会重新计算hash值而这里的计算方式就不同了(看5);
HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入;
而Hashtable扩容为原容量2倍加1;
JDK7下的CurrentHashMap(线程安全)

在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成,主要实现原理是实现了锁分离的思路解决了多线程的安全问题,如下图所示:

Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样。

CurrentHashMap和hashtable的区别

ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。

左边便是Hashtable的实现方式—锁整个hash表;而右边则是ConcurrentHashMap的实现方式—锁桶(或段)。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4657804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存