Java 中比较对象内容:一个 String 示例
在 Java 练习中,两段文字看上去一样,比较结果却可能不同。理解这个现象,需要先区分对象引用与字符串内容。下面的例子使用标准 Java 语法,不依赖第三方库,可以保存为 StringComparisonDemo.java 后自行运行。
先运行一个小例子
import java.util.Objects;
public class StringComparisonDemo {
public static void main(String[] args) {
String left = new String("hello");
String right = new String("hello");
String missing = null;
System.out.println(left == right);
System.out.println(left.equals(right));
System.out.println(Objects.equals(missing, right));
System.out.println(Objects.equals(missing, null));
}
}
这段程序依次输出 false、true、false、true。前两个字符串由两次 new 表达式创建,内容相同,但不是同一个对象。这里刻意使用 new 来展示区别,日常业务代码通常直接使用字符串字面量即可。
等号比较引用
当两侧都是对象引用时,双等号判断它们是否指向同一个对象。因此,上面的第一行输出 false。如果写成 String right = left,两边引用同一个对象,比较就会得到 true。这个规则与字符串里面写了哪些字符是两回事。也不要把这里的对象规则套到所有基本类型比较上,类型不同,比较的含义也不同。
equals 比较字符串内容
String 的 equals 方法比较字符序列,所以第二行输出 true。比较用户输入、配置字段或文件中读到的文本时,通常关心内容,应该明确使用内容比较。两个字符串字面量有时会让双等号也返回 true,这与字符串驻留有关,不能据此把双等号作为一般的内容比较方法。
先考虑空值
对 null 直接调用 equals 会引发空指针异常。java.util.Objects 提供的 equals 方法可以处理空值:两边都是 null 时为 true,仅一边为 null 时为 false,两边都有对象时再调用相应的 equals。这个工具减少了手写判空分支,也使示例的意图更清楚。它并不替应用决定空字符串和 null 是否属于同一种业务状态;这个决定仍应由具体需求说明。
给练习增加可核对的情况
可以依次尝试相同内容、不同内容、一个空值和两个空值,并先写下自己预测的输出,再运行核对。接着把 right 改为直接引用 left,观察引用比较如何变化。每次只改一处,比较容易把结果与改动对应起来。示例数据使用自己编写的普通文字即可,不需要真实用户数据。
把规则与现象一起记录
学习笔记可以保留源代码、实际输出以及每个输出对应的原因。这样回头复习时,既能看到结论,也能重新运行例子。如果之后学习自定义类,需要继续了解 equals 与 hashCode 的约定;不要直接假定每个类的 equals 都像 String 一样比较内容。
说明:本文由 AI 辅助撰写并校对,用于技术知识分享。代码示例用于解释对象比较,不涉及网络请求、个人资料或文件修改。

浙公网安备 33010602011771号