Java面试技术栈(一): 谈谈你对Hashmap的理解

  • Hashmap

HashMap 是一种存取高效但不保证有序的常用容器

在JDK1.7中,“数组+链表”,不安全
在JDK1.8中,“数组+链表+红黑树”不安全, 

  • 解决并发问题,如何解决线程不安全问题

1、Collections.synchronizedMap()  

2、使用ConcurrentHashMap:采用分段锁机制 

JDK 1.5中,Segment,采用分段锁机制,默认分配16个锁,比Hashtable效率提高16倍

JDK 1.7中,Segment数组,Segment这个类继承了重入锁ReentrantLock,使得Segment可以并发,解决了线程安全,又提高了效率

JDK 1.8中,CAS和synchronized,数据结构还是数组+链表/红黑二叉树,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。

3、使用HashTable(不推荐,相对线程安全,无法做到完全同步)

  • HashMap是如何新增的

1.判断hashmap有没有初始化

2.判断key是否为空,如果为空,则保存table[0]位置

3.如果不为空,对key进行hash,结果& 数组的长度,获得应保存的位置

4.如果保存的位置为空,则保存,如果有,则说明存在冲突
5.解决冲突:先遍历链表,如果有相同的value,就更新,没有,就头插法添加到表头(1.8是尾插法)

(需要判断阈值,是否需要扩容,如果达到阈值,则需要先扩容,再插入)

  • 为什么要引入红黑树

红黑树可以自动使用二分法进行定位,效率高(长度超过8时才使用红黑树,),比链地址法效率高

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值