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️⃣ 最佳实践 & 性能优化

  1. 只关心相等?用 equalsIgnoreCase
    如果业务只关心“是否一样”,直接 a.equalsIgnoreCase(b) 更快、语义更清晰。
  2. 批量比较或排序
    使用 String.CASE_INSENSITIVE_ORDER 作为比较器,避免重复创建 lambda:
    Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    
  3. 避免 NPE
    Optional.ofNullable(str1).orElse("").compareToIgnoreCase(str2)
    
  4. 缓存比较结果
    在循环内多次比较同一字符串时,可先把两串 toLowerCase()/toUpperCase() 后再比较,减少大小写转换开销(仅在长度大且比较次数多时有效)。

7️⃣ 一句话总结

“compareToIgnoreCase = 字典序 + 忽略大小写;返回 0 即相等,<0 在前,>0 在后;若要相等判断或本地化排序,换用 equalsIgnoreCase 或 Collator。”