必须用 equals(),不能用 ==;因为 == 比较字符串引用地址而非内容,常量池外创建的字符串(如 new string、用户输入、json 解析)用 == 必然返回 false,导致逻辑错误。

Java 中比较 String 内容,必须用 equals(),不能用 ==。因为 == 比的是内存地址,不是文字内容;哪怕两个字符串看起来一模一样,== 也可能返回 false,导致逻辑出错甚至程序崩溃。
为什么 == 不适合比较字符串内容
== 对所有引用类型都只判断是否指向同一块内存。String 是引用类型,所以:
-
String a = "hello"; String b = "hello";→a == b可能为true(常量池复用,但不可靠) -
String c = new String("hello");→a == c一定为false,即使内容完全相同 - 从用户输入、文件读取、JSON 解析等渠道拿到的字符串,几乎都不在常量池里,
==必然失效
推荐的 equals() 使用方式
用 equals() 才是真正比“内容是否一致”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 区分大小写:
"Yes".equals(input)(推荐把字面量放左边,避免空指针) - 忽略大小写:
"yes".equalsIgnoreCase(input),比input.toLowerCase().equals("yes")更高效、更安全 - 防空指针统一方案:
Objects.equals(input, "yes"),JDK 7+ 原生支持,自动处理null
容易被忽略的干扰因素
有时 equals() 返回 false,但肉眼看不出区别,常见原因有:
- 首尾有空格:用
.trim()清理,例如input.trim().equals("yes") - 不可见字符:如全角空格、零宽空格(
\u200b)、BOM、制表符或换行符 - 编码或 locale 问题:比如土耳其语中
i的大小写规则特殊,慎用toLowerCase()手动转换
其他比较场景怎么选
按需选择合适的方法,不混用:
- 判断相等(内容)→ 用
equals()或equalsIgnoreCase() - 判断字典顺序(排序、查找)→ 用
compareTo(),返回0表示相等 - 做常量快速校验(极少数情况)→ 确保字符串已调用
.intern(),才可谨慎用==,日常业务不要碰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










