在Java的对象比较场景中,String.equals()和Objects.equals()都是常用的比较方法,但两者的空安全处理逻辑存在明显区别,使用不当很容易触发空指针异常,下面来详细梳理两者的差异。

两个方法的基本定义
String.equals()是String类的实例方法,用来比较两个字符串的内容是否相等,属于字符串对象的特有比较方法。Objects.equals()是java.util.Objects工具类的静态方法,用来比较两个任意对象的相等性,支持所有引用类型的比较。
空安全逻辑的核心差异
String.equals()的空安全特性
String.equals()作为实例方法,调用它的对象如果是null,会直接抛出NullPointerException。只有当调用方法的字符串对象不为空时,才会正常执行比较逻辑,此时如果被比较的对象是null,会返回false。
看下面的示例代码:
public class StringEqualsTest {
public static void main(String[] args) {
String str1 = null;
String str2 = "test";
// 下面这行代码会抛出NullPointerException
// boolean result1 = str1.equals(str2);
String str3 = "test";
// 调用对象不为空,被比较对象为null,返回false
boolean result2 = str3.equals(str1);
System.out.println(result2); // 输出false
// 两个都不为空,内容相同返回true
boolean result3 = str3.equals(str2);
System.out.println(result3); // 输出true
}
}
Objects.equals()的空安全特性
Objects.equals()是静态方法,内部已经做了空值判断,无论两个比较对象是否为null,都不会抛出空指针异常。它的核心逻辑是:如果两个对象都是null,返回true;如果一个是null另一个不是,返回false;如果都不为null,再调用第一个对象的equals方法比较。
对应的代码示例如下:
import java.util.Objects;
public class ObjectsEqualsTest {
public static void main(String[] args) {
String str1 = null;
String str2 = "test";
// 两个对象都为null,返回true
boolean result1 = Objects.equals(null, null);
System.out.println(result1); // 输出true
// 一个为null一个不为null,返回false
boolean result2 = Objects.equals(str1, str2);
System.out.println(result2); // 输出false
// 都不为null,调用equals比较内容
boolean result3 = Objects.equals(str2, "test");
System.out.println(result3); // 输出true
// 即使第一个比较对象是null也不会抛异常
boolean result4 = Objects.equals(str1, str2);
System.out.println(result4); // 输出false
}
}
两者的使用场景区分
- 如果是确定字符串对象不为空,想要比较字符串内容,优先使用String.equals(),比如已经做过空值校验的字符串变量比较。
- 如果不确定两个比较对象是否为空,尤其是比较的对象可能是null的情况,优先使用Objects.equals(),避免空指针异常。
- 当比较的对象不是String类型,而是其他自定义引用类型时,Objects.equals()是更通用的选择,只要对应的类正确重写了equals方法即可。
常见误区提醒
很多开发者会误以为Objects.equals()只能比较String类型,实际上它可以比较所有引用类型。还有开发者会在已经确定对象不为空的情况下强行使用Objects.equals(),虽然不会出错,但多了一次空值判断的开销,不过这种开销在大多数场景下可以忽略。
另外要注意,如果自定义类没有重写equals方法,那么调用Objects.equals()比较该类的两个实例时,会比较对象的引用地址,而不是内容,这一点和直接用equals方法的表现是一致的。
String_equalsObjects_equals空安全Java修改时间:2026-06-22 02:21:27