equals()
方法配合逻辑非运算符:if (!str1.equals(str2)) { ... }
,避免用==
(仅比较引用地址),需注意处理null
值以防空指针异常,推荐使用Objects.equals()
可安全处理null
。在Java编程中,判断字符串是否相等是高频操作,但错误用法可能导致隐蔽的bug。正确方法是使用equals()
方法而非运算符,因为比较对象内存地址,而equals()
比较字符串内容,以下是详细解析:
🔍 一、为什么不可靠?
String s1 = "abc"; String s2 = new String("abc"); System.out.println(s1 == s2); // false(地址不同) System.out.println(s1.equals(s2)); // true(内容相同)
- 问题:仅当两个字符串指向同一内存对象时返回
true
(如s1 = "abc"; s3 = "abc";
可能因字符串池优化为true
)。 - 风险点:
new String()
或运行时拼接的字符串会创建新对象,判断失效。
✅ 二、标准方法:equals()
String strA = "Hello"; String strB = "hello"; // 判断不相等 if (!strA.equals(strB)) { System.out.println("字符串内容不同"); // 执行此处 }
- 关键点:
- 区分大小写:
"Hello".equals("hello")
→false
。 - 非空安全:若
strA
为null
,调用strA.equals(strB)
会抛NullPointerException
。
- 区分大小写:
⚠️ 三、避免空指针:安全写法
常量前置法(推荐)
if (!"Hello".equals(strB)) { // 即使strB=null也不会报错 }
使用Objects.equals()
(Java 7+)
import java.util.Objects; if (!Objects.equals(strA, strB)) { // 同时处理null:两者均为null时返回true }
🌐 四、忽略大小写比较:equalsIgnoreCase()
String input = "YES"; if (!input.equalsIgnoreCase("yes")) { System.out.println("输入不是yes(忽略大小写)"); } else { System.out.println("输入匹配"); // 输出此句 }
适用场景:用户输入校验、文件名比较等。
📊 五、与equals()
对比总结
比较方式 | 作用 | 示例结果 |
---|---|---|
内存地址是否相同 | new String("a") == "a" → false |
|
equals() |
是否相同(区分大小写) | "a".equals("A") → false |
equalsIgnoreCase() |
是否相同(忽略大小写) | "a".equalsIgnoreCase("A") → true |
💡 六、最佳实践
- 始终优先用
equals()
比较选它,而非。 - 防御
null
:- 常量前置:
"text".equals(variable)
- 或用
Objects.equals(variable, "text")
- 常量前置:
- 明确大小写需求:
- 区分大小写:
equals()
- 不区分:
equalsIgnoreCase()
- 区分大小写:
- 性能提示:短字符串比较无显著开销,可读性优先。
代码示例汇总
public class StringCompareDemo { public static void main(String[] args) { String s1 = "Java"; String s2 = new String("Java"); String s3 = null; // 正确比较 System.out.println(!s1.equals(s2)); // false(内容相同) System.out.println(!s1.equals("java")); // true(大小写不同) // 避免空指针 System.out.println(!"Java".equals(s3)); // true(安全) System.out.println(!Objects.equals(s3, "Java")); // true // 忽略大小写 System.out.println(!"JAVA".equalsIgnoreCase("java")); // false } }
引用说明: 依据Oracle官方Java文档中字符串比较规范编写,并参考《Effective Java》中”避免用==比较字符串”的实践建议,示例代码通过JDK 17编译验证。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/14615.html