在 Java 中,isEmpty()
和 isBlank()
是用于判断字符串状态的两种方法,它们的核心区别在于对“空”和“空白”的定义及实现逻辑不同。以下是具体分析:
一、功能区别
-
isEmpty()
- 定义:检查字符串是否为“空”,即长度为 0 或
null
(需注意:原生String.isEmpty()
不处理null
,但 Apache Commons 的StringUtils.isEmpty()
会处理null
) 。
- 行为:
isEmpty(null)
→true
(仅限工具类方法如StringUtils.isEmpty()
)isEmpty("")
→true
isEmpty(" ")
→false
(因长度不为 0)
- 定义:检查字符串是否为“空”,即长度为 0 或
-
isBlank()
- 定义:检查字符串是否为“空白”,即空、
null
或仅包含空白字符(如空格、制表符、换行符等) 。 - 行为:
isBlank(null)
→true
(工具类方法)isBlank("")
→true
isBlank(" ")
→true
isBlank("\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()
模拟 。
通过合理使用这两种方法,可以更精确地处理字符串的“空”与“空白”状态,提升代码的健壮性。