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时才使用红黑树,),比链地址法效率高

猜你喜欢

转载自blog.csdn.net/fengj20015/article/details/108197730