判断字符串内容是否相同应使用equals(),==仅比较对象引用是否相同;字符串字面量因常量池复用可能使==返回true,而new创建的对象即使内容相同==也为false。

Java 中比较字符串内容,== 比较的是两个字符串对象是否指向内存中的同一个地址(即是否为同一对象),而 equals() 比较的是两个字符串对象的内容是否完全相同(字符序列一致)。
== 比较:看的是“是不是同一个对象”
当用 == 判断两个字符串时,Java 只检查它们的引用是否指向堆中同一块内存。即使内容一模一样,只要不是同一个对象,结果就是 false。
- 字符串字面量(如
"abc")会被放入字符串常量池,相同字面量会复用同一个对象,此时 == 可能返回 true - 用
new String("abc")创建的字符串一定在堆中新建对象,即使内容相同,== 也返回 false - 示例:
String a = "hello";<br> String b = "hello";<br> System.out.println(a == b); // true(常量池复用)
String c = new String("hello");<br> String d = new String("hello");<br> System.out.println(c == d); // false(两个不同堆对象)
equals() 比较:看的是“内容是否一样”
equals() 是 String 类重写后的方法,它逐个比较两个字符串的字符序列,大小写敏感,只要内容完全一致就返回 true。
- 推荐用于判断字符串内容是否相等,这是最常用、最安全的方式
- 注意 null 安全:直接调用
null.equals("abc")会抛出 NullPointerException,建议写成"abc".equals(str)或先判空 - 忽略大小写的比较可用
equalsIgnoreCase()
常见误区和实用建议
新手容易混淆 == 和 equals(),导致逻辑错误。记住几个关键点:
立即学习“Java免费学习笔记(深入)”;
- 永远不要用 == 判断字符串内容是否相等,除非你明确想确认是否是同一个对象(极少场景)
- 如果变量可能为 null,优先用
Objects.equals(str1, str2)(Java 7+),它内部做了 null 安全处理 - 字符串拼接或转换后的结果(如
substring()、trim()、toLowerCase())通常生成新对象,即便内容相同,== 也不成立
总结一句话
要判断“两个字符串内容是否相同”,一律用 equals();== 只适合极少数需要确认对象身份的场景,日常开发中几乎不用它比较字符串内容。


















