1️⃣ 方法定义
public int compareToIgnoreCase(String anotherString)
功能:按字典序(Unicode 值)比较两个字符串,完全忽略大小写差异。
返回:
- <0:当前字符串排在 anotherString 之前
- 0:两字符串在忽略大小写的前提下相等
-
0:当前字符串排在 anotherString 之后
2️⃣ 示例代码
String a = "Apple";
String b = "apple";
String c = "Banana";
System.out.println(a.compareToIgnoreCase(b)); // 0 相等
System.out.println(a.compareToIgnoreCase(c)); // -1 Apple < Banana
System.out.println(c.compareToIgnoreCase(a)); // 1 Banana > Apple
快速判断相等:
if (a.compareToIgnoreCase(b) == 0) {
System.out.println("相等(忽略大小写)");
}
3️⃣ 使用技巧
场景 | 写法 |
---|---|
排序忽略大小写 | list.sort(String::compareToIgnoreCase); |
忽略大小写的 TreeSet | new TreeSet<>(String.CASE_INSENSITIVE_ORDER); |
自定义比较器 | Comparator<String> cmp = String::compareToIgnoreCase; |
4️⃣ 常见错误 & 异常
错误 | 原因 | 解决 |
---|---|---|
NullPointerException |
任意一方为 null |
提前判空或使用 Objects.requireNonNull() |
与 == 混用 |
== 只比较引用 |
始终使用返回值逻辑判断 |
与国际化排序混淆 | 仅按 Unicode,不考虑本地化规则 | 使用 Collator 做本地化比较 |
5️⃣ 注意事项
- 不保证相等即
equals
为 true:"Straße".compareToIgnoreCase("STRASSE") == 0
,但equalsIgnoreCase
可能为false
(德语 ß vs ss)。 - 性能:比
equalsIgnoreCase
略慢,因为必须遍历到第一个不同字符;若仅需要相等判断,优先使用equalsIgnoreCase
。 - 线程安全:
String
不可变,方法本身线程安全;但比较前需确保引用非null
。
6️⃣ 最佳实践 & 性能优化
- 只关心相等?用
equalsIgnoreCase
如果业务只关心“是否一样”,直接a.equalsIgnoreCase(b)
更快、语义更清晰。 - 批量比较或排序
使用String.CASE_INSENSITIVE_ORDER
作为比较器,避免重复创建 lambda:Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
- 避免 NPE
Optional.ofNullable(str1).orElse("").compareToIgnoreCase(str2)
- 缓存比较结果
在循环内多次比较同一字符串时,可先把两串toLowerCase()
/toUpperCase()
后再比较,减少大小写转换开销(仅在长度大且比较次数多时有效)。
7️⃣ 一句话总结
“compareToIgnoreCase = 字典序 + 忽略大小写;返回 0 即相等,<0 在前,>0 在后;若要相等判断或本地化排序,换用 equalsIgnoreCase 或 Collator。”