JAVA研发面试题(集合)HashMap vs HashTable vs ConcurrentHashMap

JAVA研发面试题(集合)

JAVA集合(目录):
集合类概述
ArrayList vs LinkedList 、ArrayList底层是如何实现的
HashMap vs HashTable vs ConcurrentHashMap

map这个类,有几种实现,包括了HashMap,TreeMap,HashTable等等,

HashMap原理|底层实现、JDK 1.8对HashMap的改进

HashMap和HashTable的区别、对HashTable了解吗?HashTable是怎么实现的?hash冲突是线程安全的吗?(synchronized) hashcode的作用?(寻找在数组中的位置/快速查找)

HashMap继承自抽象类AbstractMap,而HashTable继承自抽象类Dictionary
HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出
			NullPointerException异常
初始容量大小和每次扩充容量大小的不同
使用Entry链表来存储(解决hash冲突)。
HashTable默认的初始大小为11,之后每次扩充为原来的2n+1。HashMap
			默认的初始化大小为16,之后每次扩充为原来的2倍。
HashTable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小
公开的方法比如get都使用了synchronized描述符。而遍历视图比如keySet都
			使用了Collections.synchronizedXXX进行了同步包装。

concurrentHashMap和hashTable在性能上的区别?以及这种差异形成的原因

concurrentHashMap 性能高于hashTable ,hashTable对整个数组加锁

HashMap原理|底层实现:–可以加一个null
hashmap 底层是一个数组加链表的结构
初始:数组长度为16,扩容2倍负载因子0.75f ,数组中存的是一个个的Entry(4个属性:hash,key,value,next)
put: 当刚开始put一个键值对,检查数组是否初始化好(长度为空,数组为null,若没有则去resize()–检查容量是否>元素数量*负载因子),新建entry,如果key的哈希值在数组的对应位置上为null,则直接加进去,否则判断是否相等,遍历这条链看看有没有hash相同的,有的话覆盖并返回原来的value,否则采取头插式加入链中,如果链的长度超过8,则将链表转换成红黑树结构。
get: get时就去找hash的位置上有没有元素,如果没有返回null,否则看一下第一个节点是否相等,不相等遍历后面,直到找到相等的节点,然后返回e.value;找不到返回null

----线程不安全,多个线程一起resize有可能会造成死循环(jdk1.7)
JDK1.8后,除了对hashmap增加红黑树结果外,对原有造成死锁的关键原因点(新table复制在头端添加元素)改进为依次在末端添加新的元素。虽然JDK1.8后添加红黑树改进了链表过长查询遍历慢问题和resize时出现导致put死循环的bug,但还是非线性安全的,比如数据丢失等等。因此多线程情况下还是建议使用concurrenthashmap。(https://blog.csdn.net/hupoling/article/details/80614858)

hashTable是线程安全的,在大多数方法加了同步关键字

concurrentHashMap—不能加null
1.7 分段锁数组,每一个分段类似于hashmap,有一个entry数组,
put/get都要同步
put数据先去找属于哪个段,然后获取锁,定位hashentry,遍历节点,新建entry加入这个段(是否扩容),释放锁
get数据先找属于哪个分段----
1.8 取消分段锁,使用node代替,用cas+同步关键字保证同步,链长>8转为红黑树
put同步/get不用
当put数据时,先去找hash的位置,然后查找对应位置是否没有数据,如果没有数据就cas插入数据,如果当前节点正在扩容,则当前线程就加入扩容,否则进入同步代码块,,遍历这个链上所有节点,如果没有相同的就通过头插式插入
当get数据时,找到hash的位置,看看是否当前节点为null,返回null,否则遍历剩下的然后找到返回。
其中val \next 都是volatile的

参考:http://zhaox.github.io/2016/07/05/hashmap-vs-hashtable

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值