关于哈希的十到常见面试题

面试题一:HashMap为什么要使用红黑树而非其他数据结构来存储数据?

更快的搜索和插入速度:红黑树是一种自平衡二叉搜索树,因此查找和插入操作的时间复杂度为 O(log n),而链表的时间复杂度为 O(n)。在哈希冲突比较严重的情况下,使用红黑树能够更快地进行搜索和插入操作。

更稳定的性能:红黑树是"近似平衡"的。红黑树相比avl树,在检索的时候效率其实差不多,都是通过平衡来二分查找。但对于插入删除等操作效率提高很多。

面试题二:什么是负载因子?它的值为什么是0.75?

负载因子是用于衡量和哈希表中元素填满程度的一个参数,在HashMap中,负载因子和扩容机制有关系,当元素个数超过了容量*负载因子的时候,为了减少哈希冲突,就会进行扩容,提高HashMap性能。

负载因子太低会导致大量的空桶浪费空间,负载因子太高会导致大量的碰撞,降低性能。0.75 的负载因子在这两个因素之间取得了良好的平衡,它提供了空间和时间复杂度的良好平衡。

面试题三:HashMap是线程安全的吗?说下具体原因?

HashMap在多线程的环境下是不安全的,原因主要是两个方面:

  1. 原子性问题:HashMap操作不是原子性的,也就是说在多线程的环境下,如果多个线程同时对HashMap进行修改操作,可能会导致数据不一致。例如:让两个程序同时进行修改操作的时候,他们可能会计算出相同的文职,然后同时进行插入元素,这样会导致其中一个线程插入的元素被另一个线程所覆盖
  2. 内存可见性问题:在多线程的环境下,当一个线程修改了HashMap的状态,而另一个线程可能无法立即看到这个修改。

为了解决这个问题,Java提供了集中线程安全的Map实现,例如:Hashtable、ConcurrentHashMap和Collections.synchronizedMap,这些实现采用了不同的策略保证线程安全。但是这些实现在单线程的效率不如HashMap,所以我们需要按照需求来权衡

面试题四:HashMap会导致CPU 100%?什么场景下会出现这个问题?

HaahMap在多线程的环境下可能会导致CPU使用率达到100%,主要是由于HashMap在并发扩容可能会出现死循环:

后续不是很理解,会补充

面试题五:什么是哈希冲突?如何解决哈希冲突

哈希冲突指的是在哈希表中,不同的键通过哈希函数计算后得到的相同的哈希地址。

解决哈希冲突的方法有以下几种:

  1. 开放地址法:当哈希冲突的时候,去寻找下一个新的空的哈希地址。
  2. 链地址法:将哈希表的每一个桶都设置为链表,当哈希冲突的时候,将新的元素添加到链表的末尾。缺点:当链表过长的时候,查询效率会降低。
  3. 再哈希法:当哈希冲突的时候,试试用另一个哈希函数计算出一个新的哈希值,然后将元素插入到对应的桶中。缺点需要额外的哈希函数,且当哈希函数不够随机会产生聚集

面试六:说一下HashMap的查询流程?

HashMap的查询流程分为以下几步:

  1. 计算哈希值:根据hashCode()计算出哈希值
  2. 计算索引:使用哈希值和数组长度计算出在数组中的索引位置
  3. 查找元素:在数组的这个索引上,可能有一个链表或者红黑树(如果链表超过一定的阈值,就会将链表转化为红黑树),遍历链表或者红黑树,通过equal()方法找到对应的元素
  4. 返回结果:如果招到了对应的元素,就返回该元素的值,如果没有找到,就返回null

面试题七:HashMap和Hashtable有什么区别?

HashMap和Hashtable都实现了Map接口,但是他们还是有以下几种区别:

  1. 线程安全:Haahtable是线程安全的,HashMap是非线程安全的。在多线程的环境下如果使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合。如:
  2. null键和null值:HashMap允许使用null作为键和值,大那是Hashtable不允许null作为键或值
  3. 继承类不同:HashMap继承自AbstractMap类,而Hashtable继承于Dictionary抽象类
  4. 默认容量不同:HashMap默认容量是16,Hashtable默认容量是11,影响因子都是0.75,HashMap扩容是翻倍,而Hashtable扩容是容量+1
  5. 底层数据结构:JDK 1.7中HashMap和Hashtable都是数组和链表,但是在JDK 1.8中HashMap引入了红黑树

面试题八:为什么Hashtable不允许插入null?而HashMap却可以?

Hashtable不允许插入null原因是:

  1. 空指针异常:Hashtable源码中,put方法会调用hashCode()方法来计算哈希值,如果key为null,则会抛出一个空指针异常,而value为null也会空指针异常
  1. 歧义性:当Hashtable的get方法返回nul,无法判断这个null是因为key是从未在Hashtable中映射过,还是因为value本身就是null

HashMap允许插入null原因是:

特殊处理:HashMap源码中,当key为null的时候,会将其哈希值设置为0,因此不会调用hashCode方法,避免空指针异常

面试题九:ConcurrentHashMap是怎么保证线程安全的?

  1. 分段锁技术:ConcurrentHashMap将内部的数据分为多个段,每个段都有自己的锁,这样在写操作的时候,只需要将锁定正在修改的哪一部分,而不是整个Map,这种锁分段技术可以让多个修改操作并发进行,提高并发性能
  2. 原子操作:ConcurrentHashMap提供了一些方法,如putIfAbsent()、replace()和remove(),这些方法都可以保证在并发的环境下的原子性
  3. 内存可见性:ConcurrentHashMap使用了volatile关键字和final关键字来保证内存可见性
  4. 并发级别:ConcurrentHashMap允许设置并发级别,这个并发级别决定了ConcurrentHashMap内部的段数量。并发级别越高,段数量越多,从而减少线程的竞争,提高并发性能

面试题十:说一下ConcurrentHashMap锁优化?

ConcurrentHashMap锁优化主要有两点:

  1. 锁粒度优化:JDK 1.7 ConcurrentHashMap使用的是分段锁,JDK 1.8之后使用的是枷锁一个数组的头接待你。锁粒度更小,意味着并发执行的时候效率更高
  2. 锁实现优化:JDK 1.7 使用的是ReentrantLock和synchronized实现加锁的,JDK 1.8 使用的是CAS或者synchronized来实现枷锁,CAS是乐观锁的实现,相比于ReentrantLock和synchronized的悲观锁,性能会有一定的优化

  • 33
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: Redis常见面试题包括但不限于以下几个方面: 1. Redis的特点和优势:Redis是一个基于内存的NoSQL数据库,支持多种数据结构和丰富的操作,具有高性能、高并发、持久化、主从同步等特点。 2. Redis的数据结构:Redis支持多种数据结构,包括字符串(string)、列表(list)、集合(set)、有序集合(sorted set)和哈希(hash),每种数据结构都有相应的操作方法。 3. Redis的持久化方式:Redis有两种持久化方式,分别是RDB(Redis Database)和AOF(Append Only File)。RDB是将内存中的数据定期保存到磁盘上,而AOF是将每个写操作追加到文件末尾。 4. Redis的使用场景:Redis可以用于缓存、会话管理、计数器、排行榜、消息队列等多种场景。它的高性能和丰富的数据结构使得它在处理大量并发请求和快速读写的场景下表现出色。 5. Redis的并发访问:Redis采用单进程单线程模式,通过队列模式将并发访问变为串行访问。在Jedis客户端对Redis进行并发访问时可能会出现连接超时、数据转换错误、阻塞等问题,需要注意处理这些并发访问的情况。 综上所述,Redis是一个功能强大的基于内存的NoSQL数据库,具有多种数据结构和丰富的操作方法,适用于多种场景。在面试中,了解Redis的特点、数据结构、持久化方式、使用场景和并发访问等方面的知识是非常重要的。 #### 引用[.reference_title] - *1* *2* [redis面试题总结(附答案)](https://blog.csdn.net/guorui_java/article/details/117194603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [精选 21道 Redis 最常问面试题!收藏一波 !](https://blog.csdn.net/w915209092/article/details/126035419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lose_rose777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值