当前位置:首页 > 后端开发 > 正文

Java如何比较两个字符串相等?

在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()

用于不区分大小写的场景(如验证码、用户名):

Java如何比较两个字符串相等?  第1张

String captcha = "AbCd";
String userInput = "aBcD";
System.out.println(captcha.equalsIgnoreCase(userInput)); // true

关键注意事项

  1. 字符串常量池机制
    JVM会复用字面量字符串(如 String s = "text"), 可能返回 true,但绝不依赖此特性做内容比较

  2. new String() 的特殊性
    new String("text") 强制创建新对象,与字面量声明地址不同:

    String a = "text";
    String b = new String("text");
    System.out.println(a == b);  // false (地址不同)
  3. 性能敏感场景
    高频比较时(如循环体),先检查长度可提升效率:

    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版本验证,符合工业级开发标准。

0