Java Objects工具类

介绍

在 Java 中,java.util.Objects 类是 Java 7 引入的一个工具类,提供了一系列静态方法,用于操作对象的常见操作(如判空、比较、哈希计算等),旨在简化代码并减少空指针异常(NullPointerException)的风险。

核心特性

  • 所有方法均为 静态方法,无需实例化,直接通过 Objects.方法名() 调用。
  • 主要用于处理对象的空值安全操作、比较、哈希、字符串转换等。

常用方法

判断null方法

static boolean isNull(Object obj)

判断对象是否为 null,返回 true 表示为 null。
示例:

String str = null;
System.out.println(Objects.isNull(str)); // true

static boolean nonNull(Object obj)

判断对象是否不为 null,返回 true 表示非空(与 isNull 相反)。
示例:

String str = "hello";
System.out.println(Objects.nonNull(str)); // true

null与返回值

requireNonNull()

static <T> T requireNonNull(T obj)

检查对象是否为 null,若为 null 则抛出 NullPointerException,否则返回该对象。常用于参数校验。
示例:

public void method(String param) {
    Objects.requireNonNull(param); // 若 param 为 null,直接抛异常
    // 后续逻辑
}

requireNonNull()可自定义异常

static <T> T requireNonNull(T obj, String message)

重载方法,可自定义异常信息。
示例:

Objects.requireNonNull(param, "参数 param 不能为 null");

requireNonNullElse

static <T> T requireNonNullElse(T obj, T defaultObj)

若 obj 不为 null 则返回 obj,否则返回 defaultObj(defaultObj 不能为 null)。

示例:

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) 比较。

示例:

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 被视为小于任何非空对象)。

示例:

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)。

示例:

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() 实现。

示例:

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)。

示例:

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()。

示例:

Object obj = null;
System.out.println(Objects.toString(obj, "默认值")); // "默认值"

其他实用方法

requireNonNullElseGet

static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)

若 obj 为 null,通过 Supplier 接口提供默认值(延迟加载,适合默认值创建成本较高的场景)。

示例:

String str = null;
String result = Objects.requireNonNullElseGet(str, () -> "通过Supplier生成的默认值");

总结

Objects 类的核心价值在于 空值安全处理 和 简化常见操作,尤其在避免 NullPointerException 和简化 equals()、hashCode() 实现时非常实用。日常开发中,建议优先使用 Objects 的方法替代直接操作对象(如 obj == null、obj.equals(...) 等),以提升代码的健壮性和可读性。


原文出处:/show_1GW2ERzzXc5T.html