问题导读
一、为什么 HashMap 中 String、Integer 这样的包装类适合作为 Key?
二、什么是哈希冲突?
三、你知道 fail-fast 和 fail-safe 吗?
1
为什么 HashMap 中 String、Integer 这样的包装类适合作为 Key?
正经回答:
String、Integer 等包装类的特性能够保证 Hash 值的不可更改性和计算准确性,能够有效的减少 Hash 碰撞的几率。
- 都是 final 类型,即不可变性,保证 key 的不可更改性,不会存在获取 hash 值不同的情况
- 内部已重写了 equals()、hashCode()等方法,遵守了 HashMap 内部的规范(不清楚可以去上面看看 putValue 的过程),不容易出现 Hash 值计算错误的情况;
朋友圈分享一下
2
什么是哈希冲突?
正经回答:
当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)。
3
你知道 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 -