String 比较:内容相等与同一个对象是两回事
登录名来自请求参数,配置项来自文件,二者即使显示一样,也不应该用 == 判断内容。字符串池会让部分示例碰巧通过,反而掩盖问题。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Tutorial for Beginners
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
登录名来自请求参数,配置项来自文件,二者即使显示一样,也不应该用 == 判断内容。字符串池会让部分示例碰巧通过,反而掩盖问题。
理解核心机制
== 比较引用是否指向同一对象,equals 比较 String 的字符内容。对象可能为空时可以用 Objects.equals;涉及大小写、空白或 Unicode 规范化时,应先确定业务规则,再比较规范化后的值。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.util.Objects;
public class Demo {
public static void main(String[] args) {
String a = "admin";
String b = new String("admin");
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(Objects.equals(null, b));
}
}适用边界与常见误区
equalsIgnoreCase 不是所有语言环境下的用户身份规则。不要为了比较而调用 intern,也不要把密码比较写成随意的字符串规范化逻辑;认证应交给经过设计的组件。
继续练习
分别构造字面量、new String 和 null,记录 ==、equals、Objects.equals 的结果。再把输入换成带前后空白的文本,明确是否应该被当作同一名称。