java安全对象比较与非空校验应使用objects.equals()替代手动判空比较,重写equals()时需同步重写hashcode()并用objects.hash();非空校验按场景选isnull/nonnull、requirenonnull或requirenonnullelse。

Java 中实现安全的对象比较与非空校验,核心是善用 Object 类的契约规范和 Objects 工具类提供的标准化方法,避免手动判空、类型转换或字段比较带来的隐患。
用 Objects.equals() 替代手写 null 安全比较
直接调用 a.equals(b) 在 a 为 null 时会抛出 NullPointerException。正确做法是统一使用 Objects.equals(a, b):
- 内部自动处理任一参数为
null的情况:两者都为null返回true;仅一个为null返回false - 对基本类型包装类、字符串、数组、集合、自定义对象均适用,无需额外判断
- 在重写
equals()方法时,所有字段比较都应使用它,例如:Objects.equals(this.name, other.name)
非空校验要分场景选对工具方法
不是所有“判空”目的都一样,需按语义选择合适方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 仅做布尔判断:用
Objects.isNull(obj)或Objects.nonNull(obj) - 参数合法性强制保障:用
Objects.requireNonNull(obj),在传入null时立即抛出带堆栈的NullPointerException - 提供默认值:用
Objects.requireNonNullElse(obj, defaultValue)(Java 9+) - 避免在
equals()开头写if (obj == null) return false;—— 这步仍必要,但后续字段比较不再需要重复判空
重写 equals() 必须同步重写 hashCode()
二者必须保持契约一致:相等的对象必须有相同哈希码。否则放入 HashMap、HashSet 会失效:
-
hashCode()实现推荐用Objects.hash(field1, field2, ...),它自动处理字段为null的情况 - 参与
hashCode()计算的字段,必须与equals()中用于比较的字段完全一致、顺序相同 - 不要在
hashCode()中加入临时字段、时间戳、随机数等不稳定值
字段比较要注意类型细节
不同字段类型需匹配对应的安全比较方式:
- 引用类型字段:统一用
Objects.equals(a, b) - 数组字段:用
Arrays.equals(arr1, arr2),不能用arr1.equals(arr2) - 浮点数字段:用
Double.compare(a, b) == 0或指定误差范围,避免==判断 - 集合字段:仍可用
Objects.equals(set1, set2),它会委托到集合自身的equals()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










