在 Java 中,判断一个 String 对象是否为“空”是一个常见且重要的操作,这里的“空”通常有两种含义:

- 值为
null:该变量没有指向任何String对象。 - 空字符串 :该变量指向一个
String对象,但这个对象不包含任何字符。
一个健壮的判断逻辑需要同时处理这两种情况。
下面我将从最推荐的方法到其他可行方法,为你详细解释。
最推荐的方法:使用 java.util.Objects (Java 7+)
这是现代 Java 开发中最推荐、最简洁、最安全的方法,它专门用于处理对象为 null 的情况。
import java.util.Objects;
public class StringIsEmptyExample {
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = "Hello";
String str4 = " "; // 包含空格的字符串,通常不算空
// 使用 Objects.equals()
// Objects.equals(a, b) 的逻辑是: a == b || (a != null && a.equals(b))
// 所以当 str 为 null 时,Objects.equals(str, "") 会返回 false,但我们要的是 true
// 更通用的写法是:
boolean isStr1Empty = Objects.equals(str1, "");
boolean isStr2Empty = Objects.equals(str2, "");
boolean isStr3Empty = Objects.equals(str3, "");
boolean isStr4Empty = Objects.equals(str4, "");
System.out.println("str1 is empty: " + isStr1Empty); // true
System.out.println("str2 is empty: " + isStr2Empty); // true
System.out.println("str3 is empty: " + isStr3Empty); // false
System.out.println("str4 is empty: " + isStr4Empty); // false
// 如果你想同时判断 null 和 "",可以组合使用
boolean isStr1NullOrEmpty = str1 == null || str1.isEmpty();
boolean isStr2NullOrEmpty = str2 == null || str2.isEmpty();
System.out.println("str1 is null or empty: " + isStr1NullOrEmpty); // true
System.out.println("str2 is null or empty: " + isStr2NullOrEmpty); // true
}
}
优点:

- 代码简洁:一行代码搞定。
- 线程安全:
Objects是工具类,方法都是静态的,非常安全。 - NPE 安全:不会因为
str为null而抛出NullPointerException。
经典方法:String.isEmpty() (Java 6+)
String.isEmpty() 是 String 类的一个实例方法,它只判断字符串的长度是否为 0。它不能处理 null 的情况,如果对一个 null 字符串调用此方法,会抛出 NullPointerException。
使用时必须先进行 null 检查。
public class StringIsEmptyExample {
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = "Hello";
// 正确的写法:先判断是否为 null,再判断是否为空
boolean isStr1Empty = (str1 == null) || (str1.isEmpty());
boolean isStr2Empty = (str2 == null) || (str2.isEmpty());
boolean isStr3Empty = (str3 == null) || (str3.isEmpty());
System.out.println("str1 is empty: " + isStr1Empty); // true
System.out.println("str2 is empty: " + isStr2Empty); // true
System.out.println("str3 is empty: " + isStr3Empty); // false
// 错误的写法,会抛出 NullPointerException
// boolean isStr1EmptyWrong = str1.isEmpty();
}
}
优点:
- 语义清晰:
isEmpty()这个方法名非常直观地表达了“字符串长度为0”的含义。 - 性能好:直接检查内部用于存储字符的数组的长度,非常高效。
缺点:

- 必须手动处理
null:容易忘记,导致NPE。
其他方法(不推荐,但需要了解)
a. 检查长度 str.length() == 0
String.length() 方法返回字符串的长度,一个空字符串 的长度就是 0。
String str = ""; boolean isEmpty = (str == null) || (str.length() == 0);
这与 str.isEmpty() 在功能上是等价的。isEmpty() 是 Java 6 引入的,它本质上就是 length() == 0 的一个语法糖,让代码更易读。推荐优先使用 isEmpty()。
b. 使用 StringUtils (Apache Commons Lang / Spring)
如果你已经在使用 Apache Commons Lang 或 Spring 框架,它们的工具类提供了非常方便的方法。
Apache Commons Lang:
import org.apache.commons.lang3.StringUtils; String str = null; // isBlank() 不仅判断 null 和 "",还会判断 " " (全空格) boolean isBlank = StringUtils.isBlank(str); // true // isEmpty() 只判断 null 和 "" boolean isEmpty = StringUtils.isEmpty(str); // true
Spring Framework:
import org.springframework.util.StringUtils; String str = null; // StringUtils.isEmpty() 等同于 (str == null || str.length() == 0) boolean isEmpty = StringUtils.isEmpty(str); // true
优点:
- 非常方便,一行代码解决所有问题。
- Apache 的
isBlank()功能更强大,能处理全为空格的情况。
缺点:
- 引入外部依赖:如果你的项目不依赖这些库,为了一个简单功能而引入整个库是不划算的。
总结与最佳实践
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
Objects.equals(str, "") |
简洁、安全、无 NPE 风险 | 需要记住 Objects.equals 的特殊逻辑 |
现代 Java (7+) 项目中的首选 |
(str == null) || str.isEmpty() |
语义清晰、高效 | 需要手动写两行逻辑,易忘 null 检查 |
Java 6+ 项目,或需要极致可读性的代码 |
StringUtils.isEmpty(str) |
极其方便,功能强大(如 isBlank) |
引入外部依赖 | 项目已依赖 Apache Commons Lang 或 Spring |
str.length() == 0 |
效率高 | 语义不如 isEmpty() 清晰 |
不推荐,除非在非常古老的 Java 版本中 |
最佳实践建议:
-
对于 Java 7 及以上版本:
- 如果只是简单判断
null或 ,使用Objects.equals(str, "")。 - 如果想表达“判断字符串是否为空或空白”,使用
StringUtils.isBlank(str)(如果已引入依赖)。
- 如果只是简单判断
-
对于 Java 6 或更早版本:
- 使用
(str == null) || str.isEmpty(),这是最安全、最清晰的标准写法。
- 使用
-
代码风格:
在团队开发中,保持一致性非常重要,选择一种团队都认可的方式并坚持下去。
-
注意“空白字符串” vs “空字符串”:
- 空字符串 ():长度为 0。
- 空白字符串 (,
"\t","\n"):长度大于 0,但只包含空白字符。 - 如果你的业务逻辑需要区分这两者,请仔细选择方法。
isEmpty()只判断前者,而StringUtils.isBlank()会判断后者。
