在 Java 中,isEmpty() 和 isBlank() 是用于判断字符串状态的两种方法,它们的核心区别在于对“空”和“空白”的定义及实现逻辑不同。以下是具体分析:
一、功能区别
-
isEmpty()- 定义:检查字符串是否为“空”,即长度为 0 或
null(需注意:原生String.isEmpty()不处理null,但 Apache Commons 的StringUtils.isEmpty()会处理null) 。
- 行为:
isEmpty(null)→true(仅限工具类方法如StringUtils.isEmpty())isEmpty("")→trueisEmpty(" ")→false(因长度不为 0)
- 定义:检查字符串是否为“空”,即长度为 0 或
-
isBlank()- 定义:检查字符串是否为“空白”,即空、
null或仅包含空白字符(如空格、制表符、换行符等) 。 - 行为:
isBlank(null)→true(工具类方法)isBlank("")→trueisBlank(" ")→trueisBlank("\t\n")→true
- 定义:检查字符串是否为“空白”,即空、
二、实现原理
-
isEmpty()的实现-
原生 Java(JDK):原生方法不能处理
null,需结合判空逻辑(如str == null || str.isEmpty())public boolean isEmpty() {return value.length == 0; // 仅检查长度是否为 0 } -
Apache Commons 工具类:直接处理
null和长度判断 。public static boolean isEmpty(String str) {return str == null || str.length() == 0; }
-
-
isBlank()的实现-
Java 11+ 原生方法:遍历字符串,使用
Character.isWhitespace()判断每个字符public boolean isBlank() {return indexOfNonWhitespace() == -1; // 内部检查所有字符是否为空白 } -
Apache Commons 工具类:处理
null,并遍历检查每个字符public static boolean isBlank(String str) {int strLen = length(str);if (strLen == 0) return true;for (int i = 0; i < strLen; i++) {if (!Character.isWhitespace(str.charAt(i))) return false;}return true; }
-
三、使用场景对比
| 方法 | 适用场景 | 示例 |
|---|---|---|
isEmpty() | 严格检查字符串是否为空(无字符) | 表单字段是否未填写(不允许空格) |
isBlank() | 检查字符串是否为空或仅含空白(用户输入预处理) | 用户输入仅含空格或制表符时的判空逻辑 |
四、版本与工具类支持
-
Java 版本:
isEmpty()自 Java 6 引入(原生方法)。isBlank()自 Java 11 引入(原生方法) 。
-
工具类:
- Apache Commons Lang:
StringUtils.isEmpty()和StringUtils.isBlank()支持更早的 Java 版本,且处理null。 - Spring Framework:
StringUtils.hasText()结合非空和非空白检查 。
- Apache Commons Lang:
五、性能与注意事项
-
性能:
isEmpty()的时间复杂度为 O(1),直接检查长度。isBlank()的时间复杂度为 O(n),需遍历字符。
-
空指针问题:
- 原生
String.isEmpty()在null上调用会抛出NullPointerException,需先判空 。 - 工具类方法(如
StringUtils)自动处理null,更安全 。
- 原生
总结
- 核心区别:
isEmpty()仅检查长度,isBlank()额外检查空白字符。 - 选择依据:根据是否需要将“仅含空白”视为“空”来选用方法。
- 版本适配:Java 11+ 原生支持
isBlank(),低版本可用工具类或trim().isEmpty()模拟 。
通过合理使用这两种方法,可以更精确地处理字符串的“空”与“空白”状态,提升代码的健壮性。
