这是我参与「掘金日新计划 · 6 月更文挑战」的第7天 ,点击查看活动详情
聊聊基础的几个面试题:
很多情况下都会进行技术面试:
技术面试无外乎,基础技术的挖掘和项目场景问题的解决这两个方面:
今天来说两个对接基础面试常用的问题?
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的添加)对象锁,性能会比较慢