stringutils空安全判断和截断应使用其提供的方法:isempty判null或空,isblank过滤空白,defaultstring处理默认值,left安全截断;objectutils.equals比==更稳因可防null。

StringUtils空安全判断和字符串截断怎么写才不踩坑
直接用 == null 或 .length() 判断字符串是否为空,容易抛 NullPointerException。Apache Commons Lang 的 StringUtils 就是专治这种“没判空就调方法”的场景。
常见错误现象:传入 null 给 String.substring() 或 String.trim(),程序当场崩;用 str.equals("abc") 时 str 是 null,返回 false 还以为逻辑正常,实际漏了空分支。
-
StringUtils.isEmpty(str)→ 判null或长度为 0(等价于str == null || str.length() == 0) -
StringUtils.isBlank(str)→ 进一步过滤纯空白(" "算空) -
StringUtils.defaultString(str, "default")→null时返回默认值,比三元操作符更直白 - 截断别手写
str.substring(0, Math.min(5, str.length())),用StringUtils.left(str, 5),自动兼容null和超长情况
注意:StringUtils 所有方法都对 null 友好,但不会帮你做业务语义判断(比如“空字符串”是否合法),得结合上下文决定用 isEmpty 还是 isBlank。
ObjectUtils.equals为什么比 == 和 Objects.equals更稳
Java 自带的 Objects.equals(a, b) 其实已经够用,但 ObjectUtils.equals(a, b) 在老项目(JDK Objects.equals 的早期实现,且额外支持数组内容比较。
立即学习“Java免费学习笔记(深入)”;
使用场景:DTO 转 VO 时字段可能为 null,又不想每个地方都写 a == null ? b == null : a.equals(b);或者要比较两个 int[] 是否元素相同(== 比的是引用,Arrays.equals 才比内容,而 ObjectUtils.equals 内部会自动委托给 Arrays.equals)。
- 对普通对象,
ObjectUtils.equals(a, b)行为等同于Objects.equals(a, b) - 对数组(
int[],String[]等),它能正确比内容,不用手动区分类型调Arrays.equals - 对
null,它保证不抛异常,且ObjectUtils.equals(null, null) == true
性能上无差异,但要注意:如果项目已全面用 JDK 7+,优先用 Objects.equals 更轻量;只有当你已经在大量用 Commons Lang,且涉及数组比较时,ObjectUtils.equals 才真省事。
StringUtils.replace vs StringUtils.replaceAll:正则不是默认开关
名字带 “replace” 不代表一定走正则——这是最容易混淆的一点。StringUtils.replace 是字面量替换,StringUtils.replaceAll 才用正则。写错会导致意料外的行为,比如想删掉所有 ".",结果用了 replaceAll(".", ""),把整个字符串清空了(因为 . 在正则里是通配符)。
-
StringUtils.replace("a.b.c", ".", "-")→"a-b-c"(安全,字面替换) -
StringUtils.replaceAll("a.b.c", "\.", "-")→"a-b-c"(必须双反斜杠转义) - 想替换固定子串,无脑选
replace;只有需要模糊匹配(如“所有数字”“开头是X的”)才用replaceAll - 性能上,
replace明显更快,无正则编译开销
顺带一提:StringUtils.replaceOnce 和 replaceEach 也都是字面量操作,不碰正则引擎。
Lang 3.x 和 2.x 的包名、方法废弃差异
如果你在维护老项目,很可能还在用 org.apache.commons.lang(2.x),但新项目应直接上 org.apache.commons.lang3(3.x)。两者不兼容,最典型的坑是:3.x 把所有工具类改成 final + static 方法,且移除了对 JDK 1.2 的兼容支持。
- 包名必须改:
import org.apache.commons.lang.StringUtils→import org.apache.commons.lang3.StringUtils -
StringUtils.join(Collection, ",")在 2.x 中接受Collection,3.x 改成泛型Iterable>,传Map会编译失败 -
ObjectUtils.toString(obj, null)在 2.x 返回"null",3.x 返回null(更符合直觉,但也可能破原有逻辑) - Maven 坐标从
commons-lang换成commons-lang3,不能共存
升级时别只改 import,重点扫一遍 StringUtils 和 ObjectUtils 的参数类型、返回值变化,尤其注意 null 输入下的行为是否和以前一致——这点最容易被忽略,测试覆盖不到就留隐患。










