Java Objects工具类 作者:马育民 • 2025-11-15 11:10 • 阅读:10007 # 介绍 在 Java 中,`java.util.Objects` 类是 Java 7 引入的一个工具类,提供了一系列静态方法,用于操作对象的常见操作(如判空、比较、哈希计算等),旨在简化代码并减少空指针异常(`NullPointerException`)的风险。 ### 核心特性 - 所有方法均为 **静态方法**,无需实例化,直接通过 `Objects.方法名()` 调用。 - 主要用于处理对象的空值安全操作、比较、哈希、字符串转换等。 # 常用方法 判断null方法 ### static boolean isNull(Object obj) 判断对象是否为 `null`,返回 `true` 表示为 `null`。 示例: ```java String str = null; System.out.println(Objects.isNull(str)); // true ``` ### static boolean nonNull(Object obj) 判断对象是否不为 `null`,返回 `true` 表示非空(与 `isNull` 相反)。 示例: ```java String str = "hello"; System.out.println(Objects.nonNull(str)); // true ``` # null与返回值 ### requireNonNull() ``` static T requireNonNull(T obj) ``` 检查对象是否为 `null`,若为 `null` 则抛出 `NullPointerException`,否则返回该对象。常用于参数校验。 示例: ```java public void method(String param) { Objects.requireNonNull(param); // 若 param 为 null,直接抛异常 // 后续逻辑 } ``` ### requireNonNull()可自定义异常 ``` static T requireNonNull(T obj, String message) ``` 重载方法,可自定义异常信息。 示例: ```java Objects.requireNonNull(param, "参数 param 不能为 null"); ``` ### requireNonNullElse ``` static T requireNonNullElse(T obj, T defaultObj) ``` 若 `obj` 不为 `null` 则返回 `obj`,否则返回 `defaultObj`(`defaultObj` 不能为 `null`)。 **示例:** ```java String str = null; String result = Objects.requireNonNullElse(str, "默认字符串"); // "默认字符串" ``` # 对象比较方法 - equals() ``` static boolean equals(Object a, Object b) ``` 安全地比较两个对象是否相等,避免空指针异常。 - 若 `a` 和 `b` 均为 `null`,返回 `true`; - 若其中一个为 `null`,返回 `false`; - 否则调用 `a.equals(b)` 比较。 示例: ```java String a = "abc"; String b = new String("abc"); System.out.println(Objects.equals(a, b)); // true(避免了 a 为 null 时的 NPE) ``` ### 自定义类 当自定义类没有正确实现 `equals()` 方法时,`Objects.equals()` 方法可能会产生不符合预期的结果。举个例子: ``` public class ObjectsDemo1 { public static void main(String[] args) { Person person1 = new Person("沉默王二", 18); Person person2 = new Person("沉默王二", 18); System.out.println(Objects.equals(person1, person2)); // 输出:false } } class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } } ``` 在上面的例子中,我们创建了一个名为 `Person` 的类,但是没有重写 `equals()` 方法。然后我们创建了两个具有相同属性的 Person 对象,并使用 `Objects.equals()` 方法比较它们。尽管这两个对象的属性是相同的,但输出结果却是 `false`。这是因为 `Objects.equals()` 方法依赖于对象的 `equals()` 方法,而在这个例子中,`Person` 类没有正确地实现 `equals()` 方法,所以默认情况下会使用 `Object` 类的 `equals()` 方法,它只比较对象引用是否相同。 为了解决这个问题,我们需要在 `Person` 类中重写 `equals()` 方法: ``` @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); } ``` 现在,当我们使用 `Objects.equals()` 方法比较两个具有相同属性的 `Person` 对象时,输出将是 `true`,符合我们的预期。 参考:https://javabetter.cn/common-tool/Objects.html # 对象比较方法 - compare() ``` static int compare(T a, T b, Comparator super T> c) ``` 使用比较器(`Comparator`)比较两个对象,支持空值安全比较(`null` 被视为小于任何非空对象)。 示例: ```java Integer x = 3; Integer y = 5; // 比较两个整数,使用自然顺序比较器 System.out.println(Objects.compare(x, y, Comparator.naturalOrder())); // -2(3 < 5) ``` # 哈希与哈希码 ### hashCode() ``` static int hashCode(Object o) ``` 返回对象的哈希码,若对象为 `null` 则返回 `0`(避免 `o.hashCode()` 时的 NPE)。 **示例:** ```java String str = "test"; System.out.println(Objects.hashCode(str)); // 等同于 str.hashCode() System.out.println(Objects.hashCode(null)); // 0 ``` ### hash() ``` static int hash(Object... values) ``` 计算多个对象的组合哈希码,常用于自定义类的 `hashCode()` 实现。 **示例:** ```java class Person { String name; int age; @Override public int hashCode() { return Objects.hash(name, age); // 组合 name 和 age 的哈希码 } } ``` # 字符串转换 ### 方式1 ``` static String toString(Object o) ``` 将对象转换为字符串,若对象为 `null` 则返回 `"null"`(避免 `o.toString()` 时的 NPE)。 **示例:** ```java Object obj = null; System.out.println(Objects.toString(obj)); // "null" System.out.println(Objects.toString("hello")); // "hello" ``` ### 方式2 ``` static String toString(Object o, String nullDefault) ``` 若对象为 `null`,返回指定的默认字符串;否则返回 `o.toString()`。 **示例:** ```java Object obj = null; System.out.println(Objects.toString(obj, "默认值")); // "默认值" ``` ## 其他实用方法 ### requireNonNullElseGet ``` static T requireNonNullElseGet(T obj, Supplier extends T> supplier) ``` 若 `obj` 为 `null`,通过 `Supplier` 接口提供默认值(延迟加载,适合默认值创建成本较高的场景)。 **示例:** ```java String str = null; String result = Objects.requireNonNullElseGet(str, () -> "通过Supplier生成的默认值"); ``` # 总结 `Objects` 类的核心价值在于 **空值安全处理** 和 **简化常见操作**,尤其在避免 `NullPointerException` 和简化 `equals()`、`hashCode()` 实现时非常实用。日常开发中,建议优先使用 `Objects` 的方法替代直接操作对象(如 `obj == null`、`obj.equals(...)` 等),以提升代码的健壮性和可读性。 原文出处:http://malaoshi.top/show_1GW2ERzzXc5T.html