判断字符串是否为空或仅含空白字符:Java 11+ 用 isBlank(),Java 8 及以前需 null 检查后 trim().isEmpty();substring() 在 Java 7u6 后改为复制数组防内存泄漏,Java 9 起优化为 O(1);split() 默认丢弃末尾空串,可用负 limit 保留;拼接优先用 String.join() 或 StringBuilder,避免循环中用 +。
如何判断字符串是否为空或只包含空白字符
用 isEmpty() 判断长度是否为 0,但要注意它不处理空格;真正安全的写法是先用 isBlank()(Java 11+)——它会把 "\t\n " 这类也算作“空白”。Java 8 及以前得手动写 str == null || str.trim().isEmpty(),但要注意 trim() 对 null 会抛 NullPointerException,所以必须先判空。
-
isEmpty():仅检查 length == 0,速度快,但对" "返回 false -
isBlank():Java 11 引入,内部调用chars().allMatch(Character::isWhitespace),兼容 Unicode 空白符(如 、 ) - 老版本替代方案务必写成
str != null && str.trim().isEmpty(),顺序不能反
为什么 substring() 在 Java 7u6 之后性能变差又变好
Java 7u6 前,substring() 复用原字符串的 char[] 数组,内存不释放(大字符串截一小段,原数组仍被引用);7u6 到 Java 8 中改成了「复制新数组」,解决内存泄漏但带来额外开销;Java 9 起改用 byte[] + 编码标记,substring() 再次变成 O(1) 时间且无共享数组风险。
- Java 8 下大量调用
substring()可能引发 GC 压力,尤其从长日志中反复提取字段时 - 如果确定子串生命周期短于原串,可考虑用
String.valueOf(charArray, offset, count)避免构造中间 String - 注意
substring(beginIndex, endIndex)的 endIndex 是「不包含」的,越界直接抛StringIndexOutOfBoundsException
split() 的坑:为什么 "a..b".split("\\.") 返回长度为 3 的数组
split() 默认丢弃末尾空字符串,但遇到连续分隔符时,中间的空串会被保留。上面例子中正则 "\." 匹配点号,"a..b" 拆成 ["a", "", "b"] —— 因为两个点号之间有长度为 0 的子串。