优先用isblank()校验字符串是否为空,因它会trim后判断,避免" "被误判为非空;isempty()仅判长度,适用于对空白敏感场景。

StringUtils.isEmpty() 和 isBlank() 到底该用哪个?
判断字符串是否为空,isEmpty() 看的是长度是否为 0,isBlank() 还会额外 trim 后再判空。别一上来就用 isEmpty(),否则 "
" 这种会被当成“非空”导致逻辑出错。
-
isEmpty(null)→true;isEmpty("")→true;isEmpty(" ")→false -
isBlank(null)→true;isBlank("")→true;isBlank(" ")→true - 表单提交、配置读取、JSON 解析后字段校验,优先用
isBlank() - 拼接路径、生成 SQL 片段等对空白敏感的场景,才考虑
isEmpty()
replace()、replaceAll()、replaceEach() 性能与语义差异
replace() 是字面量替换,不走正则;replaceAll() 底层调用 String.replaceAll(),会编译正则,有开销且可能抛 PatternSyntaxException;replaceEach() 适合多对一/多对多批量替换,但要注意数组长度必须一致,否则直接 IllegalArgumentException。
- 想把所有
"&"换成"and",用replace("&", "and"),别用replaceAll() - 要删掉所有数字:用
replaceAll("\d+", ""),replace()不支持 -
replaceEach(str, new String[]{"a", "b"}, new String[]{"x", "y"})中两个数组长度不等 → 立刻炸 - 高频调用场景(如日志清洗),避免在循环里反复调用
replaceAll()
split() 的坑:空字符串保留、limit 参数和 null 安全
StringUtils.split("a,,c", ",") 返回 ["a", "c"],中间空串被丢了;而 String.split() 默认也丢,但加 -1 才保留。Commons Lang 的 split() 不支持 limit 的负数语义,得换 splitPreserveAllTokens()。
- CSV 解析、日志字段切分,需要保留空字段 → 用
splitPreserveAllTokens(str, ",") -
split("a,b,c", ",", 2)只切一次,结果是["a", "b,c"];但splitPreserveAllTokens()不支持 limit -
split(null, ",")返回null;split("", ",")返回空数组[];注意 NPE 风险 - 分隔符含正则元字符(如
"."、"|"),split()会按字面意思处理,不用转义;但replaceAll()就必须转
capitalize()、uncapitalize() 和大写转换的边界情况
capitalize("java") → "Java",但它只改首字母,不碰其余字符大小写;upperCase() 才是全转大写,但受 Locale 影响——土耳其语里 "i" 转大写不是 "I",而是 "İ"。线上服务若涉及多语言用户,别裸用 upperCase()。
-
capitalize("JAVA")→"JAVA"(首字母已大写,后面不动) - 想让整个字符串首字母大写、其余小写:得组合用
capitalize(lowerCase(str)) -
upperCase(str, Locale.ENGLISH)可规避 locale 副作用,但需明确传入 -
uncapitalize(null)返回null,但uncapitalize("")返回"",注意空值链式调用










