Skip to content

Commit 0096b37

Browse files
Update 2022-06-21-java.md
1 parent eda8e3d commit 0096b37

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

_posts/2022-06-21-java.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,23 @@ pin: true
3434
2. 基本数据类型没有 `equals()` 方法
3535
3. 针对自定义对象而言,如果没有重写 `equals()` 方法,则两者没有区别,`equals()` 内部是通过 `==` 来判断。
3636

37-
3837
### 重写 equals() 为什么一定要重写 hashCode()
3938

40-
1. 对比两个对象是否相等时,先使用 hashCode() 判断,再用 equals() 判断
41-
2. 相同的对象一定要有相同的哈希值
39+
在 Java 中,如果重写 `equals()`,必须同时重写 `hashCode()`。因为像 HashMap、HashSet 这样的哈希结构是先通过 `hashCode()` 定位桶,再通过 `equals()` 判断对象是否相等。如果两个对象 `equals()` 相等但 `hashCode()` 不相等,它们会被放入不同的桶,从而导致集合中出现逻辑上重复的元素。
40+
41+
```java
42+
Set<User> set = new HashSet<>();
43+
set.add(new User("Tom"));
44+
set.add(new User("Tom"));
45+
46+
set.size() == 2 // 不重写 hashCode 的情况
47+
```
4248

43-
假设重写 equals() 但没有重写 hashCode(),并且因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行先后判断,如果没有重写 hashCode(),则直接认为两个对象不相等。
4449

4550

4651
### 为什么不直接使用 hashCode 就确定两个对象是否相等呢
4752

48-
这是因为不同对象的 hashCode 可能相同但 hashCode 不同的对象一定不相等,所以使用 hashCode 可以起到快速初次判断对象是否相等的作用。
53+
哈希冲突:不同对象的 hashCode 可能相同但 hashCode 不同的对象一定不相等,所以使用 hashCode 可以起到快速初次判断对象是否相等的作用。
4954

5055
# 内存结构
5156

0 commit comments

Comments
 (0)