| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 面试HashMap你都扛不住,还想拿到offer? -> 正文阅读 |
|
[数据结构与算法]面试HashMap你都扛不住,还想拿到offer? |
当我们面试Java开发岗位时,面试官问的频率出现最多的问题,就是这个HashMap,不管是传统型公司还是互联公司,HashMap是必问的,所以作者爆肝整理了HashMap的23个问题以及答案,请查收! 1、你知道HashMap的数据结构吗? HashMap底层是基于数组 + 链表实现的,不过在 jdk1.7 和 1.8 中具体实现稍有不同 HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体。只是在JDK1.8中,链表长度大于8的时候,链表会转成红黑树! 2、什么是Hash冲突,如何解决Hash冲突? 哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是我们需要清楚的是数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法(数组+链表的形式)。 3、用LinkedList代替数组结构可以吗?有什么优缺点? 因为用数组效率最高!在HashMap中,定位桶的位置是利用元素的key的哈希值对数组长度取模得到。此时,我们已得到桶的位置。显然数组的查找效率比LinkedList大; 4、HashMap何时扩容以及它的扩容机制? 如果bucket满了(超过load factor*current capacity),就要resize。load factor为0.75,为了最大程度避免哈希冲突current capacity为当前数组大小 5、为何HashMap的数组长度一定是2的次幂? 因为2的n次方实际就是1后面n个0,2的n次方-1,实际就是n个1。 例如长度为8时候,3&(8-1)=3??2&(8-1)=2,不同位置上,不碰撞。 而长度为5的时候,3&(5-1)=0??2&(5-1)=0,都在0上,出现碰撞了。 所以,保证容积是2的n次方,是为了保证在做(length-1)的时候,每一位都能&1,保证地址散列均匀分布 6、说一下HashMap在1.7中put元素的过程??
7、说一下HashMap中get元素的过程??
8、说一下HashMap在1.8中put元素的过程? 过程跟1.7差不多,但是多了一些判断:
9、说一下HashMap在1.8中get元素的过程?
10、HashMap在JDK8做了哪些优化?
11、为什么在解决Hash冲突的时候,不直接用红黑树?而是选择优先使用链表,再转红黑树?
12、不用红黑树用二叉树可以吗? 可以。但是二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。 13、当链表转换成红黑树后,什么时候退化为链表?
14、HashMap在并发条件下会有什么问题?
15、在JDK8中还有这些问题吗? 在jdk1.8中,死循环问题已经解决。其他两个问题还是存在 16、HashMap键可以是Null吗? 必须可以,key为null的时候,hash算法最后的值以0来计算,也就是放在数组的第一个位置。 17、你一般使用什么作为HashMap的key? 一般用Integer、String这种不可变类当HashMap当key,而且String最为常用。
18、当使用对象作为HashMap的Key时有什么问题吗? 要重写equals和hashcode方法。否则会出现以下问题: hashcode可能发生改变,导致put进去的值,无法get出,如下所示 ?输出值如下: 19、HashMap是线程安全的吗?如何实现线程安全? HashMap是线程不安全的。 实现方式:
20、请谈谈ConcurrentHashMap底层实现原理? 在JDK7中ConcurrentHashMap采用了"锁分段"策略,ConcurrentHashMap的主干是一个一个Segment组,在ConcurrentHashMap中,一个Segment就是一个子哈希表,Segment里维护了一个HashEntry数组,并发环境下,对于不同Segment的数据进行操作是不用考虑锁竞争的,对于同一个Segment的操作才需考虑线程同步。理论上就允许16个线程并发执行。 21、ConcurrentHashMap的size()方法实现原理?
22、ConcurrentHashMap中put过程? 因为volatile不保证原子性,所以在put操作中需要对Segment加锁。 put操作分为两步:
23、HashMap和HashTable的区别?
以上是整理的比较全面的HashMap面试题,大家记住答案的同时,最好还是理解其原理!!!????? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:51:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |