用equals()比较字符串内容,不是==;==比较引用地址,equals()比较内容;null安全用Objects.equals()或字面量.equals();忽略大小写用equalsIgnoreCase()而非toLowerCase().equals()。

用 equals() 比较字符串内容,不是 ==
Java 中字符串比较最常踩的坑:用 == 判断两个字符串是否“相等”。== 比的是引用是否指向同一块内存地址,而多数场景下你真正想比的是内容是否相同。
比如:
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
-
equals()是String类重写后的方法,语义是“内容相等”,安全可靠 -
==仅在确定两个变量引用同一个对象时才适用(例如都来自字符串常量池、或显式用intern()) - 如果其中一个字符串可能为
null,直接调用str.equals(other)会抛NullPointerException;推荐写成"literal".equals(str)或用Objects.equals(str1, str2)
compareTo() 用于排序和字典序判断
当需要知道两个字符串谁“大”谁“小”,或者要实现 Comparable 接口、放进 TreeSet / TreeMap 时,必须用 compareTo()。
- 返回负数表示调用者字典序小于参数,0 表示相等,正数表示大于
- 区分大小写:
"Apple".compareTo("apple") (因为大写 A 的 Unicode 小于小写 a) - 若需忽略大小写,用
compareToIgnoreCase() - 性能上略低于
equals(),因为它要逐字符比较直到找到差异点,而equals()在长度不等时可立即返回false
忽略大小写的比较:别只靠 toLowerCase() 再 equals()
常见错误写法:str1.toLowerCase().equals(str2.toLowerCase())。这看似可行,但有隐患:
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
- 创建了两个新字符串对象,增加 GC 压力
- 某些 locale 下行为异常(如土耳其语中
i和I的映射不满足常规预期) - 更稳妥的方式是:
str1.equalsIgnoreCase(str2)—— 它内部做了 locale-aware 处理,且避免无谓对象分配 - 若需严格按 ASCII 忽略大小写(比如协议字段校验),可用
String.CASE_INSENSITIVE_ORDER.compare(s1, s2) == 0
空值安全与性能敏感场景下的选择
真实项目里常遇到 “不确定是否为空” 或 “高频调用” 场景,这时选错方法会影响健壮性或吞吐量:
- 判空 + 内容相等:优先用
Objects.equals(s1, s2),它内部已处理null分支,语义清晰且 JDK 7+ 原生支持 - 大量短字符串比较(如配置 key 匹配):可考虑先用
==快速失败(因常量池复用率高),再 fallback 到equals(),但需确认字符串来源可控 - 注意
String.contentEquals(CharSequence):可接受StringBuilder/CharSequence子类,避免 toString() 开销,适合拼接后立刻比较的场景
最容易被忽略的一点:字符串比较的语义依赖于你的业务定义——是纯 ASCII?要不要考虑 Unicode 规范化?是否涉及国际化排序?这些都不是 equals() 或 compareTo() 单独能解决的,得配合 java.text.Collator 或 Normalizer。








