hashmap和hashtable

面试常见题目,问了我们,我们菜鸟能说些啥,看源码我表示看不懂。
我们回答一些别人总结出来的吧,表示自己大概知道这些东西。
1、线程安全
hashtable是线程安全的,hashmap不是线程安全的
hashtable为啥线程安全?它的源码里面所有的元素操作都是synchronized修饰的,
像public synchronized v put(k key, v value);和 public synchronized v get (object key);

2、性能优劣
hashtable是线程安全,是因为它在操作的时候,只能运行它一个线程,其他方法都要被他阻塞,
所以hashtable性能差,hashmap性能好。面试官问有没有其他可以代替hashtable的,我们要回答
ConcurrentHashMap。我们初级会经常使用多线程吗?多线程高并发我表示用不到,但是这又是很重要的。
你去百度一下,ConcurrentHashMap,你就会看到“ConcurrentHashMap是Java中的一个线程安全且高效的HashMap实现
平时涉及高并发如果要用map结构,那第一时间想到的就是它。”

3、关于null空值问题
hashtable的键和值都不允许为空。
hashmap的键只能有一个为空,值可以很多个为空。

4、容量扩容
hashmap初始容量:16    负载因子0.75   扩容规则:当前容量翻倍
hashtable初始容量:11     负载因子0.75   扩容规则:当前容量翻倍加一


因为hashtable有更好的替代者,已经被弃用了,HashTable的类注释

If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable.
If a thread-safe highly-concurrent implementation is desired, then it is recommended to
use java.util.concurrent.ConcurrentHashMap in place of Hashtable.

如果你不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新的代码中再使用它。

问题:
ConcurrentHashMap为什么比hashtable好?

回答:

ConcurrentHashMap底层采用分段的数组(HashEntry)+链表实现,Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分段技术

锁分段技术首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

ConcurrentHashMap提供了与Hashtable不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。

ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。

下面主要讲讲hashmap

1、hashmap底层数据结构
jdk1.7的存储结构是数组+链表,到了jdk1.8变成了数组+链表+红黑树

上图是jdk1.7,下图是jdk1.8
注意:只有在链表的长度不小于8,而且数组的长度不小于64的时候才会将链表转化为红黑树

链表增删效率高,红黑树查找效率高,所以jdk1.8以后hashmap增删效率高,查找效率也提升了。

问题之为什么不直接用红黑树而还要保存链表呢

(1)构造红黑树比构造链表复杂,在链表的节点不多的时候,从整体的性能看来, 数组+链表+红黑树的结构可能不一定比数组+链表的结构性能高。就好比杀鸡焉用牛刀的意思。
(2)hashmap是固定容量的,如果hashmap频繁的扩容,会造成底部红黑树不断的进行拆分和重组,这是非常耗时的。因此,也就是链表长度比较长的时候转变成红黑树才会显著提高效率。

关于详细的可以去下面文章里面去看

转载:https://zhuanlan.zhihu.com/p/51593918?utm_source=wechat_session&utm_medium=social&utm_oi=909339736806662144

https://zhuanlan.zhihu.com/p/79219960?utm_source=wechat_session&utm_medium=social&utm_oi=909339736806662144

https://www.cnblogs.com/heyonggang/p/9112731.html

原文地址:https://www.cnblogs.com/lhh666/p/12044103.html