Java中含空值的CharSequence与String不区分大小写相等性校验如何实现?
不区分大小写校验CharSequence与String(含空值处理)
这个问题我之前也碰到过,嵌套if确实太啰嗦,稍不注意还容易踩空指针的坑。给你几个简洁又安全的方案,按需选择:
方案1:自己封装原生工具方法(简洁版)
如果不需要考虑极端性能,这个实现足够简单安全,能覆盖绝大多数场景:
public static boolean equalsIgnoreCase(CharSequence cs, String s) { // 两个都为空,视为相等 if (cs == null && s == null) { return true; } // 其中一个为空,另一个不为空,直接不等 if (cs == null || s == null) { return false; } // 非空情况下,将CharSequence转为String后调用equalsIgnoreCase return s.equalsIgnoreCase(cs.toString()); }
逻辑说明:
- 先处理空值边界情况,避免后续调用方法时出现
NullPointerException - 当
cs非空时,调用toString()是安全的,所有CharSequence实现类(比如String、StringBuilder、StringBuffer)都重写了这个方法
方案2:原生高效实现(避免生成新字符串)
如果你的CharSequence是大对象(比如超长的StringBuilder),生成新String会额外占用内存,这时可以用逐个字符比较的方式:
public static boolean equalsIgnoreCase(CharSequence cs, String s) { // 空值判断 if (cs == null && s == null) { return true; } // 空值或长度不等直接返回false if (cs == null || s == null || cs.length() != s.length()) { return false; } int length = s.length(); for (int i = 0; i < length; i++) { char c1 = cs.charAt(i); char c2 = s.charAt(i); // 大小写不敏感比较:原字符相等,或转大写/小写后相等 if (c1 != c2 && Character.toUpperCase(c1) != Character.toUpperCase(c2) && Character.toLowerCase(c1) != Character.toLowerCase(c2)) { return false; } } return true; }
优势:
- 不需要生成中间
String对象,内存更高效 - 提前判断长度不等的情况,快速返回结果
方案3:借助第三方工具库(最省心)
如果你的项目已经引入了Apache Commons Lang库,直接用现成的工具方法就行,它已经帮你处理了所有边界情况:
import org.apache.commons.lang3.StringUtils; // 直接调用,支持两个CharSequence的大小写不敏感比较,自动处理空值 boolean isEqual = StringUtils.equalsIgnoreCase(yourCharSequence, yourString);
这个方法的内部逻辑和我们自己封装的高效版类似,但经过了大量测试,稳定性拉满。
内容的提问来源于stack exchange,提问作者sagar suri
相关产品推荐
相关产品推荐

