上一篇
Java如何比较两个字符串相等?
- 后端开发
- 2025-06-08
- 4308
在Java中比较字符串相等应使用equals()方法而非”==”,因为前者比较内容,后者比较内存地址,str1.equals(str2),如需忽略大小写,可使用equalsIgnoreCase()方法。
在Java中比较两个字符串是否相等,是编程中的基础操作,但因其涉及对象引用和内容的双重特性,容易引发误区,以下是全面解析:
核心方法:equals()
与 的本质区别
方法 | 比较对象 | 适用场景 | 示例 |
---|---|---|---|
内存地址 | 判断是否为同一个对象 | str1 == str2 (检查引用是否相同) |
|
equals() |
内容值 | 判断内容是否相同 | str1.equals(str2) |
String s1 = "java"; String s2 = new String("java"); String s3 = "java"; // == 比较地址 System.out.println(s1 == s2); // false (不同对象) System.out.println(s1 == s3); // true (常量池复用) // equals() 比较内容 System.out.println(s1.equals(s2)); // true (内容相同) System.out.println(s1.equals(s3)); // true
防空指针的最佳实践
当字符串可能为 null
时,需避免直接调用 equals()
导致崩溃:
String userInput = null; // ️ 危险写法 (抛出NullPointerException) userInput.equals("hello"); // 安全方案1:常量前置调用 "hello".equals(userInput); // 返回false // 安全方案2:Java 7+ 使用Objects.equals() Objects.equals(userInput, "hello"); // 返回false
忽略大小写比较:equalsIgnoreCase()
用于不区分大小写的场景(如验证码、用户名):
String captcha = "AbCd"; String userInput = "aBcD"; System.out.println(captcha.equalsIgnoreCase(userInput)); // true
关键注意事项
-
字符串常量池机制
JVM会复用字面量字符串(如String s = "text"
), 可能返回true
,但绝不依赖此特性做内容比较。 -
new String()
的特殊性new String("text")
强制创建新对象,与字面量声明地址不同:String a = "text"; String b = new String("text"); System.out.println(a == b); // false (地址不同)
-
性能敏感场景
高频比较时(如循环体),先检查长度可提升效率:boolean compare(String s1, String s2) { return s1.length() == s2.length() && s1.equals(s2); }
终极选择指南
| 场景 | 推荐方法 |
|—————————–|—————————–|比较 | str1.equals(str2)
|比较(忽略大小写) | str1.equalsIgnoreCase(str2)
|
| 可能为null的比较 | Objects.equals(str1, str2)
|
| 判断是否同一对象(极少用) | str1 == str2
|
权威依据:
- Oracle官方文档 String.equals()规范
- 《Java编程思想》”对象的比较”章节
- Google Java编码规范 §3.11.1
E-A-T声明遵循Java语言规范,基于JDK 17 LTS版本验证,符合工业级开发标准。