在 Java 中,isEmpty()
、null
和 ""
都用于表示"空"的概念,但它们的含义和使用场景有本质区别:
1. null
(空引用)
-
含义:表示变量未引用任何对象(内存中没有分配实际对象)。
-
特点:
- 是引用类型的默认值(如
String
、Object
等)。 - 对
null
调用任何方法(如length()
或isEmpty()
)会抛出NullPointerException
。
- 是引用类型的默认值(如
-
示例:
java
rustString str = null; System.out.println(str); // 输出 null System.out.println(str.length()); // 抛出 NullPointerException
2. ""
(空字符串)
-
含义 :一个实际存在的字符串对象,内容为空(长度为 0)。
-
特点:
- 在内存中有对象地址。
- 可以安全调用字符串方法(如
length()
返回0
,isEmpty()
返回true
)。
-
示例:
java
rustString str = ""; System.out.println(str.length()); // 输出 0 System.out.println(str.isEmpty()); // 输出 true
3. isEmpty()
(检查空内容的方法)
-
含义 :用于判断集合(Collection)或字符串(String)的内容是否为空。
-
特点:
- 字符串 :
str.isEmpty()
等价于str.length() == 0
(要求字符串非null
)。 - 集合 :如
List
、Set
、Map
的isEmpty()
检查元素数量是否为 0。
- 字符串 :
-
注意事项:
- 必须在非
null
对象 上调用,否则会抛出NullPointerException
。
- 必须在非
-
示例:
java
iniString str1 = ""; System.out.println(str1.isEmpty()); // true(内容为空) String str2 = "Hello"; System.out.println(str2.isEmpty()); // false List<String> list = new ArrayList<>(); System.out.println(list.isEmpty()); // true(集合无元素)
关键区别总结
概念 | 含义 | 内存状态 | 安全调用方法 | 示例检查方式 |
---|---|---|---|---|
null |
无对象引用 | 无对象地址 | ❌(抛出异常) | str == null |
"" |
空字符串对象 | 有对象地址(内容空) | ✅ | str.isEmpty() |
isEmpty() |
检查内容是否为空的方法 | 依赖调用对象 | 需对象非 null |
list.isEmpty() |
常见使用场景
-
安全检查空字符串 (避免
NullPointerException
):java
csharp// 推荐:先判 null 再判空内容 if (str == null || str.isEmpty()) { System.out.println("字符串为空或未初始化"); }
-
集合判空:
java
iniList<String> list = getList(); // 可能返回 null 或空集合 if (list == null || list.isEmpty()) { // 处理空集合 }
-
Java 11+ 的快捷方法 :
使用
String.isBlank()
(检查空或空白字符)或Objects.requireNonNullElse()
简化空处理。String.isBlank()
是 Java 11 引入的字符串方法,用于检查字符串是否为空或仅包含空白字符 (whitespace)。它与isEmpty()
、null
和""
有显著区别:
核心区别
方法/值 | 行为描述 | 空白字符处理 | 示例结果 |
---|---|---|---|
str == null |
表示变量未引用任何对象 | ❌ 不涉及 | null → true |
str.isEmpty() |
检查字符串长度是否为 0 | ❌ 不识别空白字符 | " " → false |
"" |
实际存在的空字符串对象(长度=0) | ❌ 不涉及 | "" → 长度 0 |
str.isBlank() |
✅ 检查字符串是否为空 或 仅包含空白字符(空格、制表符、换行符等) | ✅ 识别所有空白字符 | " \t\n" → true |
关键特性
-
空白字符识别:
java
ruby"".isBlank(); // true (空字符串) " ".isBlank(); // true (空格) "\t \n".isBlank(); // true (制表符+空格+换行符) "abc".isBlank(); // false (非空白字符)
-
与
isEmpty()
的对比:java
iniString space = " "; space.isEmpty(); // false (长度=1 ≠ 0) space.isBlank(); // true (纯空白字符) String empty = ""; empty.isEmpty(); // true (长度=0) empty.isBlank(); // true (空字符串也视为空白)
-
空指针安全:
java
iniString str = null; str.isBlank(); // 抛出 NullPointerException(需先判空)
使用场景
用户输入验证(更严格的空值检查):
java
vbscript
// 传统方式(Java 11 之前)
if (input == null || input.trim().isEmpty()) {
System.out.println("输入无效");
}
// Java 11+ 简化
if (input == null || input.isBlank()) {
System.out.println("输入无效");
// 同时捕获:null、""、" "、"\n\t" 等情况
}
实现原理
查看 JDK 源码(简化版逻辑):
java
scss
public boolean isBlank() {
return indexOfNonWhitespace() == length();
}
// 内部遍历字符,检查是否全是空白
最佳实践
-
始终优先判
null
:java
rust// 安全用法 if (str == null || str.isBlank()) { // 处理空或空白字符串 }
-
替代旧版
trim().isEmpty()
isBlank()
比trim().isEmpty()
更高效(避免创建新字符串)且 Unicode 兼容。 -
Java 版本要求 :
仅适用于 Java 11+ ,低版本需用
trim().isEmpty()
替代。
📌 总结 :
isBlank()
=isEmpty()
+ 空白字符检查,是验证用户输入、文本处理的现代方案。