java字符串比较必须用equals()而非==,因==比较引用地址而equals()比较内容;常量池使字面量==偶有成功但不可靠,new创建的字符串==必失败;推荐"abc".equals(str)或objects.equals()防空指针。

Java 中字符串比较必须用 equals(),不能用 ==,因为 == 比较的是引用是否指向同一内存地址,而 equals() 才是比较内容是否相同。
为什么 == 在字符串上不可靠
== 判断两个变量是否引用同一个对象。字符串常量池的存在会让部分字面量字符串“看起来”能用 == 比对成功,但这只是巧合,不是规范行为。
- 字符串字面量(如
"hello")会被放入常量池,相同字面量通常复用同一对象 → 此时==返回true - 但通过
new String("hello")创建的字符串一定在堆中,和常量池中的对象地址不同 → 即使内容一样,==也返回false - 运行时拼接、读取输入、JSON 解析等产生的字符串几乎都不在常量池中,
==必然失效
正确使用 equals() 的要点
调用 equals() 前需注意空指针风险,推荐以下写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用字面量或已知非空字符串调用
equals():例如"abc".equals(str),即使str为null也不会抛异常 - 若不确定两边是否为空,可用
Objects.equals(str1, str2)(Java 7+),它内部自动处理null - 避免
str.equals("abc")这种写法,当str为null时会抛NullPointerException
区分大小写的比较与忽略大小写
equals() 默认区分大小写;需要忽略大小写时,用 equalsIgnoreCase():
-
"Hello".equals("hello")→false -
"Hello".equalsIgnoreCase("hello")→true - 注意:
equalsIgnoreCase()也不处理null,仍建议写成"hello".equalsIgnoreCase(str)
其他常见误区提醒
有些方法看似安全,实则隐藏陷阱:
-
str == null ? false : str.equals("abc")逻辑正确,但不如"abc".equals(str)简洁 -
str.compareTo("abc") == 0虽可判断相等,但语义不清、性能略差,不推荐用于单纯相等判断 - 正则、
contains、startsWith等方法都基于内容,和==无关,无需额外注意
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










