hashCode方法不处理字段非空逻辑,需显式判空;null字段直接调用hashCode会抛NPE,应使用三元表达式或Objects.hashCode();多字段组合推荐Objects.hash();基本类型可直用,包装类和自定义对象须确保null安全。

hashCode 方法本身不负责处理字段的非空逻辑,它只负责根据字段值计算一个整数哈希码。但字段是否为 null 会直接影响哈希码的计算结果——必须显式判断并给出合理替代值,否则可能抛出 NullPointerException 或破坏 equals-hashCode 契约。
字段为 null 时不能直接调用 hashCode()
String name 字段若为 null,直接写 name.hashCode() 会触发空指针异常。正确做法是用三元表达式或 Objects.hashCode() 提供安全兜底:
name == null ? 0 : name.hashCode()-
Objects.hashCode(name)—— 内部已封装 null 判断,返回 0 - 避免使用
name.toString().hashCode(),null 调用 toString() 仍会报错
多字段组合时需统一 null 处理策略
当对象含多个可能为空的引用字段(如 String、List、自定义对象),所有字段都应采用一致的 null 处理方式,保证哈希逻辑稳定:
- 推荐统一用
Objects.hash(field1, field2, field3),它自动对每个参数调用Objects.hashCode() - 手动计算时(如质数乘法),每个字段都要单独判空:
result = 31 * result + (field1 == null ? 0 : field1.hashCode());result = 31 * result + (field2 == null ? 0 : field2.hashCode()); - 注意:不能用
field1 != null && field1.hashCode(),因为 && 后半部分在 false 时不执行,无法返回值
基本类型字段无需 null 判断,但要注意包装类
int、long、boolean 等基本类型字段天然非空,可直接参与计算;但 Integer、Boolean 等包装类属于引用类型,必须按 null 处理:
立即学习“Java免费学习笔记(深入)”;
-
age(int)→ 直接用age -
ageObj(Integer)→ 用Objects.hashCode(ageObj)或ageObj == null ? 0 : ageObj.intValue() - 误把包装类当基本类型参与运算(如
ageObj.hashCode())会导致运行时 NPE
自定义对象字段要确保其 hashCode 实现健全
如果字段是自定义类(如 Address address),它的 hashCode 必须已正确重写且能处理自身字段的 null 情况:
- 若 Address 的 hashCode 内部未判空(比如直接调用
city.hashCode()),则外层即使做了保护也无用 - 建议在 Address 类中也使用
Objects.hashCode(city, street),形成安全链路 - 若 Address 不可修改,可用
address == null ? 0 : address.hashCode()容错


















