Java高频面试题日更挑战「Day4」—集合容器篇(四)

问题导读

一、为什么 HashMap 中 String、Integer 这样的包装类适合作为 Key?

二、什么是哈希冲突?

三、你知道 fail-fast 和 fail-safe 吗?

01 | 为什么 HashMap 中 String、Integer 这样的包装类适合作为 Key?

String、Integer 等包装类的特性能够保证 Hash 值的不可更改性和计算准确性,能够有效的减少 Hash 碰撞的几率

  • 都是 final 类型,即不可变性,保证 key 的不可更改性,不会存在获取 hash 值不同的情况
  • 内部已重写了 equals()、hashCode()等方法,遵守了 HashMap 内部的规范(不清楚可以去上面看看 putValue 的过程),不容易出现 Hash 值计算错误的情况

02 | 什么是哈希冲突?

当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)。

03 | 你知道 fail-fast 和 fail-safe 吗?

fail-fast 是 Java 中的一种 快速失败 机制,java.util 包下所有的集合都是快速失败的,快速失败会抛出ConcurrentModificationException 异常。

fail-fast 你可以把它理解为一种快速检测机制,它只能用来检测错误,不会对错误进行恢复,fail-fast 不一定只在多线程 环境下存在,ArrayList 也会抛出这个异常,主要原因是由于 modCount 不等于 ex pectedModCount。

fail-safe 是 Java 中的一种 安全失败 机制,它表示的是在遍历时不是直接在原集合上进行访问,而是先复制原有集合内容,在拷贝的集合上进行遍历。

由于迭代时是对原集合的拷贝进行遍历,所以在 遍历过程中对原集合所作的修改并不能被迭代器检测到, 所以不会触发 ConcurrentModificationException。

java.util.concurrent 包下的容器都是安全失败的,可以在多线程条件下使用,并发修改。

- End -

学习之路贵在坚持,扫码关注我!

浩说编程陪你每天三道高频面试题,日积月累一定会有所收获!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容