在 Java 中,判断一个字符串是否只包含空格(或为空),有几种常见的方法,我会从最推荐的方法开始,并解释每种方法的优缺点。

推荐方法:使用 String.trim()
这是最常用、最直观且最符合业务逻辑需求的方法。
String.trim() 方法会移除字符串开头和结尾的空白字符(包括空格、制表符 \t、换行符 \n 等),如果字符串在 trim() 之后变成空字符串 ,那么它就只包含空白字符。
public class StringSpaceChecker {
public static boolean isBlankOrOnlySpaces(String str) {
// 1. 首先检查字符串是否为 null,避免 NullPointerException
if (str == null) {
return true; // 或者根据业务需求决定,null 是否算作 "空"
}
// 2. 使用 trim() 移除首尾空白,然后判断是否为空
return str.trim().isEmpty();
}
public static void main(String[] args) {
String test1 = " "; // 只有空格
String test2 = " \t \n "; // 包含空格、制表符、换行符
String test3 = " Hello "; // 包含非空白字符
String test4 = ""; // 空字符串
String test5 = null; // null 引用
System.out.println("isBlankOrOnlySpaces(\" \"): " + isBlankOrOnlySpaces(test1)); // true
System.out.println("isBlankOrOnlySpaces(\" \\t \\n \"): " + isBlankOrOnlySpaces(test2)); // true
System.out.println("isBlankOrOnlySpaces(\" Hello \"): " + isBlankOrOnlySpaces(test3)); // false
System.out.println("isBlankOrOnlySpaces(\"\"): " + isBlankOrOnlySpaces(test4)); // true
System.out.println("isBlankOrOnlySpaces(null): " + isBlankOrOnlySpaces(test5)); // true
}
}
优点:
- 可读性强:
str.trim().isEmpty()的意图非常清晰。 - 功能全面:不仅判断空格,还会处理制表符、换行符等其他常见的空白字符,这通常是期望的行为。
- 健壮性:正确处理了
null值(前提是你先做了null检查)。
其他方法
方法 2:使用 String.isEmpty() + String.isBlank() (Java 11+)
如果你使用的是 Java 11 或更高版本,String 类新增了一个非常方便的方法 isBlank()。

isBlank() 方法会检查字符串是否为空或长度为 0,或者是否只包含空白字符,它比 trim().isEmpty() 更高效,因为它不需要创建一个新的 String 对象。
// Java 11+
public static boolean isBlankUsingJava11(String str) {
if (str == null) {
return true;
}
return str.isBlank();
}
// 在 main 方法中测试
// String test1 = " ";
// System.out.println("isBlankUsingJava11(test1): " + isBlankUsingJava11(test1)); // true
优点:
- 最简洁:一行代码搞定,意图明确。
- 性能最佳:内部实现比
trim()更高效,因为它避免了创建新字符串的开销。 - 官方推荐:这是 Java 官方为解决此问题提供的标准方法。
缺点:
- 版本限制:仅适用于 Java 11 及以上版本。
方法 3:使用正则表达式
如果你需要更精确的控制(只判断空格,不判断制表符),或者不使用 trim(),可以使用正则表达式。

^ 表示字符串的开始, 表示字符串的结束,\\s 表示任何空白字符(包括空格、制表符等), 表示零次或多次。
import java.util.regex.Pattern;
public class RegexSpaceChecker {
// 预编译正则表达式,提高性能(如果此方法会被频繁调用)
private static final Pattern BLANK_PATTERN = Pattern("^\\s*$");
public static boolean isBlankWithRegex(String str) {
if (str == null) {
return true;
}
// 使用 matcher().matches() 来匹配整个字符串
return BLANK_PATTERN.matcher(str).matches();
}
// 如果你只想判断空格,不包含 \t, \n 等
private static final Pattern SPACES_ONLY_PATTERN = Pattern("^ *$");
public static boolean isOnlySpaces(String str) {
if (str == null) {
return true;
}
return SPACES_ONLY_PATTERN.matcher(str).matches();
}
}
优点:
- 灵活性高:可以精确匹配你想要的字符集(只匹配空格,不匹配
\t)。 - 功能强大:正则表达式可以处理非常复杂的字符串匹配逻辑。
缺点:
- 可读性较差:对于不熟悉正则表达式的人来说,
"^\\s*$"不如trim().isEmpty()直观。 - 性能稍差:对于简单的判断,正则表达式通常比内置的字符串方法慢。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
str.trim().isEmpty() |
可读性强,功能全面,兼容所有 Java 版本 | 性能略低于 isBlank() |
通用首选,适用于所有 Java 版本。 |
str.isBlank() |
最简洁,性能最佳 | 仅限 Java 11+ | Java 11+ 的首选,代码最优雅。 |
| 正则表达式 | 灵活性极高,可精确控制匹配规则 | 可读性差,性能相对较低 | 需要复杂匹配规则,或只判断特定空白字符(如纯空格)时。 |
- 如果你的项目使用 Java 11 或更高版本,请毫不犹豫地使用
String.isBlank(),这是最现代、最高效的解决方案。 - 如果你的项目使用 Java 8 或更早版本,使用
str.trim().isEmpty()是最标准、最可靠的选择。 - 始终记得处理
null值,否则NullPointerException会找上门,通常将null视为“空”是一种合理的默认行为。
