必须用equals()而非==,因为==比较内存地址是否相同,equals()比较字符内容是否完全一致;字面量偶发相等不可依赖,new创建对象时==必为false,而equals()恒可靠。

Java 中比较两个 String 内容是否相等,必须用 equals() 方法,不能用 ==。
为什么必须用 equals() 而不是 ==
== 比较的是两个变量是否指向同一个对象(内存地址),而 equals() 比较的是字符串里每个字符是否完全一致。
- String s1 = "abc"; String s2 = "abc"; → s1 == s2 可能为 true(常量池复用,但不可依赖)
- String s1 = new String("abc"); String s2 = new String("abc"); → s1 == s2 一定为 false,但 s1.equals(s2) 一定为 true
正确写法:避免空指针异常
如果字符串可能为 null,直接调用 str.equals("xxx") 会抛出 NullPointerException。推荐以下两种安全写法:
- 把字面量放左边:
"abc".equals(str)—— 即使str是null,也不会报错,返回false - 用
Objects.equals():Objects.equals(str1, str2)—— 自动处理null,语义清晰,JDK 7+ 原生支持
忽略大小写的比较
需要不区分大小写时,用 equalsIgnoreCase():
立即学习“Java免费学习笔记(深入)”;
-
"Hello".equalsIgnoreCase("HELLO")返回true - 它同样对
null不安全:不能写nullStr.equalsIgnoreCase("test"),但可以写"test".equalsIgnoreCase(nullStr)(返回false) - 如需空安全 + 忽略大小写,可封装:
str == null ? other == null : str.equalsIgnoreCase(other)
注意不可见字符干扰
有时 equals() 返回 false,但肉眼看内容一样,常见原因是混入了:
- 全角空格、零宽空格(
u200b)、BOM 字符 - 制表符(
)、换行符()或前后多余空格 - 建议比较前用
trim()清除首尾空格,必要时用replaceAll("\s+", "")或逐字符检查


















