File tree Expand file tree Collapse file tree 1 file changed +10
-5
lines changed
Expand file tree Collapse file tree 1 file changed +10
-5
lines changed Original file line number Diff line number Diff line change @@ -34,18 +34,23 @@ pin: true
34342 . 基本数据类型没有 ` equals() ` 方法
35353 . 针对自定义对象而言,如果没有重写 ` 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
You can’t perform that action at this time.
0 commit comments