hashmap 的底层机制
聊聊基础的几个面试题:
很多情况下都会进行技术面试:
技术面试无外乎,基础技术的挖掘和项目场景问题的解决这两个方面:
今天来说两个对接基础面试常用的问题?
hashmap 的数据结构是怎么样的?
这是一个典型的基于 java 集合类型探索底层的数据,也是很多面试官非常喜欢问的问题,一方面这个可以考察你对于 java 集合类的掌握程度,是否熟悉知道如何使用,以及使用的程度,另一个方面可以可以==推理出关于线程,以及 JDK 版本更新过程中的问题接下来我们就细节聊聊
hashmap 的数据结构是 数组+链表的结构,是一个我们熟悉的对于多个元素存储的集合容器
因为有数组(快速的读)+链表(快速的插入元素)----。>使用的效率比较高,key-value 的形式
有自己扩容机制,默认是 capsitry 是 16,负载因子是 0.75,会有一个阈值 threshold,当初始容量*负载因子=阈值,大于这个范围吗,就要考虑扩容,进行 resize 了
在扩容的过程中,JDK1.7 的时候容易出现死循环,但是在 JDK1.8 的时候就修复了
JDK1.7 的时候,采用头插法将新的元素会插入链表,再扩容和并发线程的情况下,容易出现当前元素在扩容之前和扩容之后的顺序变化,导致线程并发之后,每次还是会到当前的元素,形成死循环
JDK1.8 进行了优化,将插入链表的变成尾插法,这样在扩容的时候也不会改变链表的原来的元素顺序,但是这个集合是线程不安全的
我们这里可以用的是 concurrentHashamp 进行线程并发时候的存储,这个是线程并发安全的,但也只会锁住当前节点的- 底层是 CAS 的,对象锁 sychronzied 的升级
hashtable 底层是直接对方法进行一个 数据安全锁(synchronized 的添加)对象锁,性能会比较慢
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/88dc10ffa7c199da6d4f3d1e0】。文章转载请联系作者。
评论