用equals()判断字符串内容是否相同:==比较引用地址,equals()逐字符比较内容但不安全;推荐"字面量".equals(str)或Objects.equals()处理null;忽略大小写用equalsIgnoreCase();注意不可见字符干扰。

用 equals() 判断字符串内容是否相同
Java里用 == 比较两个 String 变量,比的是引用地址,不是内容。哪怕两个字符串字面值一模一样,只要不是同一个对象,== 就可能返回 false。
正确做法是调用实例方法 equals():
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
-
equals()会逐字符比较内容,忽略对象是否为同一引用 - 它对
null不安全——如果调用方是null,会抛NullPointerException - 推荐写法:把字面量或已知非空的字符串放左边,比如
"hello".equals(str),避免空指针
处理 null 时用 Objects.equals()
当任一字符串可能为 null,又不想手动判空,Objects.equals() 是最省心的选择。
它内部已经做了空安全处理,语义清晰,JDK 7+ 原生支持:
立即学习“Java免费学习笔记(深入)”;
String x = null; String y = "test"; System.out.println(Objects.equals(x, y)); // false System.out.println(Objects.equals(x, null)); // true
- 比手写
a == null ? b == null : a.equals(b)更简洁、不易错 - 不区分参数顺序,
Objects.equals(a, b)和Objects.equals(b, a)行为一致 - 注意:它只是空安全的
equals,不忽略大小写、不忽略首尾空格
忽略大小写比较用 equalsIgnoreCase()
英文场景下常需要“不区分大小写”地判断相等,别用 toLowerCase().equals()——它会创建新字符串,浪费内存且在某些 locale 下有陷阱(比如土耳其的 i 转换规则)。
- 直接用
equalsIgnoreCase(),性能好、语义准、locale 安全 - 它同样对
null不安全,所以搭配Objects.equals()并不能自动忽略大小写 - 如果真要空安全 + 忽略大小写,得自己封装,例如:
public static boolean equalsIgnoreCaseSafe(String a, String b) { return a == null ? b == null : a.equalsIgnoreCase(b); }
字符串内容相同但行为异常?检查是否含不可见字符
有时 equals() 返回 false,但肉眼看两个字符串“明明一样”,大概率是其中混入了不可见字符:比如全角空格、零宽空格(\u200b)、BOM、制表符或换行符。
- 用
str.codePoints().forEach(System.out::println)查看每个 Unicode 码点,比charAt()更可靠 - 常见误操作:从网页、Excel 或用户粘贴来的字符串自带首尾空白或 BOM,建议统一用
trim()预处理(但注意trim()只去 ASCII 空白,Unicode 空白需用strip(),JDK 11+) - 日志里打印字符串时,用
Arrays.toString(str.toCharArray())能暴露隐藏字符










