1. 概述
在日常开发中,我们经常需要比较两个字符串是否相等,而忽略它们的大小写差异。本文将带你快速掌握 Java 中实现“忽略大小写字符串比较”的常用方式,帮你避开一些看似简单却容易踩坑的细节。
2. 使用 equalsIgnoreCase() 方法
equalsIgnoreCase()
是 String
类自带的方法,用于判断两个字符串在忽略大小写的情况下是否相等。它接收一个 String
参数,返回 boolean
。
✅ 用法简单粗暴,适合大多数场景:
String lower = "equals ignore case";
String UPPER = "EQUALS IGNORE CASE";
assertThat(lower.equalsIgnoreCase(UPPER)).isTrue();
⚠️ 注意:如果传入的参数为 null
,该方法会直接返回 false
,**不会抛出 NullPointerException
**。这一点和其他字符串方法(如 equals()
)行为一致,但容易被忽视。
例如:
String str = "hello";
assertThat(str.equalsIgnoreCase(null)).isFalse(); // 不会报错,返回 false
所以,如果你不确定输入是否可能为 null
,这个行为是安全的。但如果你希望显式处理 null
,就需要额外判断。
3. 使用 Apache Commons Lang
如果你的项目中已经引入了 Apache Commons Lang,推荐使用 StringUtils.equalsIgnoreCase()
方法。
✅ 最大的优势是:明确支持 null
安全比较,语义更清晰,代码可读性更强。
String lower = "equals ignore case";
String UPPER = "EQUALS IGNORE CASE";
assertThat(StringUtils.equalsIgnoreCase(lower, UPPER)).isTrue();
assertThat(StringUtils.equalsIgnoreCase(lower, null)).isFalse();
assertThat(StringUtils.equalsIgnoreCase(null, null)).isTrue(); // 两个 null 被认为是相等的
📌 小结对比:
方式 | 是否支持 null | 推荐场景 |
---|---|---|
String.equalsIgnoreCase() |
✅ 安全(返回 false) | 简单场景,已知非 null |
StringUtils.equalsIgnoreCase() |
✅ 更清晰的 null 语义 | 通用推荐,尤其参数可能为 null |
💡 建议:在工具类、API 接口或参数来源不确定的场景下,优先使用 StringUtils
,避免歧义。
4. 总结
equalsIgnoreCase()
是处理忽略大小写字符串比较最直接的方式,JDK 原生支持,性能良好。而 StringUtils.equalsIgnoreCase()
在 null 处理上更优雅,适合对代码健壮性要求较高的项目。
✅ 推荐做法:
- 日常开发中,能用
equalsIgnoreCase()
就用,简单高效。 - 在公共 API、服务层或参数不可控时,建议使用
StringUtils
,提升代码容错性。
⚠️ 注意:以上方法都基于默认 Locale 进行大小写转换。如果你的应用涉及多语言(如土耳其语中 'i'
和 'I'
的规则特殊),可能会出现意料之外的结果。这种情况下需要使用 Locale
感知的比较方式(例如 String.toLowerCase(Locale.TURKISH)
),我们后续会专门讲解国际化下的字符串处理踩坑实践。
所有示例代码均已上传至 GitHub:https://github.com/johnchen/my-java-demos/tree/main/string-case-compare