WMX · 随记
·Java· 3 分钟阅读

String 比较:内容相等与同一个对象是两回事

登录名来自请求参数,配置项来自文件,二者即使显示一样,也不应该用 == 判断内容。字符串池会让部分示例碰巧通过,反而掩盖问题。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Tutorial for Beginners

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

登录名来自请求参数,配置项来自文件,二者即使显示一样,也不应该用 == 判断内容。字符串池会让部分示例碰巧通过,反而掩盖问题。

理解核心机制

== 比较引用是否指向同一对象,equals 比较 String 的字符内容。对象可能为空时可以用 Objects.equals;涉及大小写、空白或 Unicode 规范化时,应先确定业务规则,再比较规范化后的值。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java10 行 · 可横向滚动
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 的结果。再把输入换成带前后空白的文本,明确是否应该被当作同一名称。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档