Java高频面试题- 每日三连问?【Day14】 — 集合容器篇(六)

2022-04-12 14:03:28 浏览数 (1)

问题导读

一、为什么 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 -

0 人点赞