






















2 encounter2017 2025 年 12 月 23 日> 但我认为的是,因为当把一个对象放进哈希表的时候,我会默认它的 hashcode 方法是默认的,也就是每个对象有唯一的哈希值。如果重写了 hashcode ,那么在使用的过程中如果不知道这个类复写了 hashcode ,那么就容易导致代码问题。 这句话有这么几个误解: 然后重写 equals 必须重写 hashcode, 为啥你可以看下面这个例子就知道了 ```java jshell> import java.util.*; jshell> class User { jshell> var set = new HashSet<User>(); jshell> set.add(new User(1)); jshell> System.out.println("contains(new User(1)) = " + set.contains(new User(1))); jshell> System.out.println("equals? " + new User(1).equals(new User(1))); 然后你如果用过 Record 就知道,调用方不知道是否重写不是风险点,相反它是语言/库的常态用法。 ```java record User2(int id) {} var m = Map.of(new User2(1), "ok"); 然后什么时候重写 equals: 你需要业务上的相等比较而不是内存地址的比较 这种情况下重写 equals 必须重写 hashcode ,原因上面说了 简单总结下: 然后还有一个点: 而这些功能和可能踩坑的点 JVM 的 Record ( 2020 年首次 preview ) 都帮你实现了 。作为对比: |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。