record类的equals和hashcode是编译器按契约自动生成的底层行为:基于值语义逐字段比较、严格依赖字段声明顺序、由不可变性保障哈希稳定性,三者共同确保符合object规范且不可绕过。

Record 类的 equals 和 hashCode 不是“加了功能”,而是编译器按契约直接生成的、不可绕过的底层行为。理解它,关键在三点:值语义、字段顺序、不可变性。
值相等即内容一致,不看是不是同一个对象
普通 class 默认用 == 比内存地址,两个字段完全相同的实例也返回 false;而 record 的 equals 自动逐字段比值:
- 先检查是否为同一类型(
instanceof) - 再按声明顺序,对每个字段调用其自身的
equals(字符串比内容、数字比数值、嵌套 record 递归比) - 所有字段都相等,才返回
true
hashCode 严格跟随 equals,字段顺序决定哈希结果
record 的 hashCode() 等价于 Objects.hash(field1, field2, ...):
- 字段值相同 → 哈希值必然相同(满足 equals/hashCode 契约)
- 字段顺序不同 → 哈希值不同(哪怕字段名和值都一样)
- 数组字段例外:默认按引用计算哈希,不是按内容——所以含
int[]或String[]时,需手动重写或改用List
不可变性保障契约稳定,无需担心中途变化
record 所有字段隐式 final,构造后无法修改:
- 哈希值在对象创建时就确定,不会因后续操作改变
- 可安全放入
HashSet、作HashMap的 key,不会出现“存进去找不着”的问题 - 线程间共享时无需额外同步,天然线程安全
它不是语法糖,是编译期强约束——你不能删掉 equals,也不能让 hashCode 和它不一致。只要用 record,这套逻辑就自动生效,且经 JVM 规范验证无误。










