应使用 equals() 比较字符串内容,避免 == 比较内存地址;空安全推荐 objects.equals() 或字面量.equals(str);忽略大小写用 equalsignorecase();注意不可见字符干扰,比较前建议 trim()。

直接用 equals() 就行,它已经足够高效,关键在写法要对。
必须用 equals(),别碰 ==
== 比的是内存地址,不是内容。哪怕两个字符串看起来一模一样,只要不是同一个对象,== 就可能返回 false。比如:
-
new String("abc") == "abc"→false -
"abc".equals(new String("abc"))→true
常量池里偶尔 == 成立,那是优化副作用,不能当逻辑依赖。
空安全写法:优先用 Objects.equals()
如果任一字符串可能为 null,直接调用 str.equals("xxx") 会抛 NullPointerException。
- 推荐:
Objects.equals(str1, str2)—— JDK 7+ 原生支持,自动判空,一行解决 - 备选:
"abc".equals(str)—— 把字面量放左边,str为null也不崩,返回false
忽略大小写时,用 equalsIgnoreCase()
需要不区分大小写比较,别写 str.toLowerCase().equals(other.toLowerCase()):
- 它会创建新字符串,浪费内存和时间
- 受系统 locale 影响,比如土耳其语下
"i".toUpperCase()不是"I" - 正确做法:
"Hello".equalsIgnoreCase("HELLO")→true,性能好、语义清
留意不可见字符干扰
有时 equals() 返回 false,但肉眼看内容一样,常见原因有:
- 首尾空格、全角空格、零宽字符(
u200b)、BOM - 制表符
、换行符等隐藏符号 - 建议比较前先
trim()清理边界空白;必要时用replaceAll("\s+", "")或逐字符检查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











