介绍
在 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(...) 等),以提升代码的健壮性和可读性。