判断 String 的值主要围绕以下几个核心问题:

- 是否为空? (包括
null和 ) - 是否为空白? (包括
null、 和 ) - 是否等于某个特定字符串? (区分大小写)
- 是否在忽略大小写的情况下等于某个特定字符串?
- 是否包含某个子串?
- 是否以某个前缀/后缀开头或结尾?
判断 String 是否为空或空白
这是最常见的需求,但也是最容易出错的地方,我们需要区分“空”和“空白”。
a. 判断是否为 "null" 或空字符串
一个 String 变量,如果它没有被赋值,它的值就是 null,如果它被赋值为 ,那么它是一个长度为 0 的空字符串。
❌ 错误的写法(会导致 NullPointerException)
String str = null;
if (str.length() == 0) { // 这里会抛出 NullPointerException
System.out.println("字符串为空");
}
✅ 正确的写法(推荐使用 java.util.Objects 工具类)

从 Java 7 开始,java.util.Objects 类提供了非常方便的工具方法。
import java.util.Objects;
String str1 = null;
String str2 = "";
String str3 = "Hello";
// 1. 使用 Objects.equals()
// 它内部会先判断 a 是否为 null,如果为 null,再判断 b 是否为 null,避免了 NPE。
if (Objects.equals(str1, "")) {
System.out.println("str1 是空字符串"); // true
}
// 2. 使用 Objects.isNull() 和 Objects.nonNull()
if (Objects.isNull(str1)) {
System.out.println("str1 是 null"); // true
}
if (Objects.nonNull(str3)) {
System.out.println("str3 不是 null"); // true
}
// 3. 综合判断:是否为 null 或空字符串
// 这是最推荐、最安全、最清晰的方式
if (str1 == null || str1.isEmpty()) {
System.out.println("str1 是 null 或空字符串"); // true
}
if (str2 == null || str2.isEmpty()) {
System.out.println("str2 是 null 或空字符串"); // true
}
if (str3 == null || str3.isEmpty()) {
System.out.println("str3 是 null 或空字符串"); // false
}
b. 判断是否为 "null"、空字符串 或纯空白字符串
空白字符串是指只包含空格、制表符 \t、换行符 \n 等空白字符的字符串。
✅ 正确的写法(推荐使用 Apache Commons Lang 或 Java 11+)
使用 Apache Commons Lang (最常用)

这是一个非常流行的第三方库,强烈推荐在项目中使用。
<!-- Maven 依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
import org.apache.commons.lang3.StringUtils;
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = " Hello ";
// StringUtils.isBlank() 是判断是否为 null、空或空白的首选方法
if (StringUtils.isBlank(str1)) {
System.out.println("str1 是 null、空或空白"); // true
}
if (StringUtils.isBlank(str2)) {
System.out.println("str2 是 null、空或空白"); // true
}
if (StringUtils.isBlank(str3)) {
System.out.println("str3 是 null、空或空白"); // true
}
if (StringUtils.isBlank(str4)) {
System.out.println("str4 是 null、空或空白"); // false
}
// 对应的 isNotBlank() 方法
if (StringUtils.isNotBlank(str4)) {
System.out.println("str4 不是 null、空或空白"); // true
}
使用 Java 11+ 的 isBlank() 方法
如果你使用的是 Java 11 或更高版本,String 类本身就已经内置了这个功能,无需额外依赖。
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = " Hello ";
// 注意:str1 是 null,调用 str1.isBlank() 仍然会抛出 NullPointerException
// 所以最好还是和 null 判断一起使用
if (str1 == null || str1.isBlank()) {
System.out.println("str1 是 null、空或空白"); // true
}
// 对于非 null 的字符串,可以直接调用
if (str3.isBlank()) {
System.out.println("str3 是空白字符串"); // true
}
if (str4.isBlank()) {
System.out.println("str4 是空白字符串"); // false
}
判断 String 是否等于特定值
a. 区分大小写的比较
✅ 正确的写法(使用 equals())
永远不要使用 来比较 String 的内容。 比较的是两个对象的内存地址(是否是同一个对象),而不是它们的内容。
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = "hello";
String s4 = "hello"; // Java 会将 s3 和 s4 指向同一个常量池对象
// 错误示范:比较的是地址
System.out.println(s1 == s2); // false,因为 new 创建了两个不同的对象
System.out.println(s3 == s4); // true,因为它们指向同一个常量池对象
// 正确示范:比较的是内容
System.out.println(s1.equals(s2)); // true
System.out.println("hello".equals("HELLO")); // false
最佳实践:常量在前
为了防止 NullPointerException,推荐将字面量常量放在 equals() 方法的左边。
String str = null;
// 错误写法,会抛出 NPE
// if (str.equals("hello")) { ... }
// 正确写法,str 为 null,表达式会返回 false,而不会报错
if ("hello".equals(str)) {
// ...
}
b. 忽略大小写的比较
✅ 正确的写法(使用 equalsIgnoreCase())
String s1 = "Hello"; String s2 = "hello"; System.out.println(s1.equals(s2)); // false System.out.println(s1.equalsIgnoreCase(s2)); // true
判断 String 是否包含子串
a. 区分大小写的包含判断
✅ 正确的写法(使用 contains())
String sentence = "The quick brown fox jumps over the lazy dog";
boolean hasFox = sentence.contains("fox"); // true
boolean hasDog = sentence.contains("dog"); // true
boolean hasCat = sentence.contains("cat"); // false
boolean hasFoxCapital = sentence.contains("Fox"); // false
b. 忽略大小写的包含判断
String.contains() 本身不忽略大小写,你需要先将字符串都转换成统一的大小写再进行比较。
✅ 正确的写法
String sentence = "The quick brown fox jumps over the lazy dog"; String searchTerm = "FOX"; // 方法1:直接转换后比较 boolean containsIgnoreCase = sentence.toLowerCase().contains(searchTerm.toLowerCase()); System.out.println(containsIgnoreCase); // true // 方法2:使用 Pattern 和 Matcher (更强大,但稍复杂) // import java.util.regex.Pattern; // boolean containsWithRegex = Pattern.compile(Pattern.quote(searchTerm), Pattern.CASE_INSENSITIVE) // .matcher(sentence) // .find(); // System.out.println(containsWithRegex); // true
判断 String 是否以特定前缀/后缀开头或结尾
✅ 正确的写法(使用 startsWith() 和 endsWith())
这两个方法都区分大小写。
String filename = "document.pdf";
boolean startsWithDoc = filename.startsWith("doc"); // false
boolean startsWithDoc2 = filename.startsWith("doc"); // false
boolean startsWithDoc3 = filename.startsWith("document"); // true
boolean endsWithPdf = filename.endsWith(".pdf"); // true
boolean endsWithTxt = filename.endsWith(".txt"); // false
总结与最佳实践
| 判断目标 | 推荐方法 | 备注 |
|---|---|---|
是否为 null |
Objects.isNull(str) 或 str == null |
Objects 工具类更清晰。 |
是否为 null 或空 |
str == null || str.isEmpty() |
Java 标准写法,清晰可靠。 |
是否为 null、空 或空白 |
StringUtils.isBlank(str) |
强烈推荐,需引入 commons-lang3 依赖。 |
| 是否等于(区分大小写) | "constant".equals(str) |
永远不要用 ,将常量放前面防 NPE。 |
| 是否等于(忽略大小写) | str.equalsIgnoreCase("constant") |
或 "constant".equalsIgnoreCase(str) |
| 是否包含(区分大小写) | str.contains("sub") |
|
| 是否包含(忽略大小写) | str.toLowerCase().contains("sub".toLowerCase()) |
|
| 是否以...开头 | str.startsWith("prefix") |
|
| 是否以...结尾 | str.endsWith("suffix") |
核心建议:
- 处理空值和空白是第一要务:在进行任何字符串操作前,先判断它是否为
null或空白,这是健壮代码的关键。 - 拥抱
StringUtils:如果你的项目允许引入第三方库,Apache Commons Lang的StringUtils是处理字符串的瑞士军刀,能极大提升代码的简洁性和可读性。 - 了解你的 Java 版本:如果你在使用 Java 11+,多利用
String类自带的isBlank()、lines()、strip()等新方法,它们非常方便。 - 保持一致性:在同一个项目中,对于同一种判断(比如判断是否为空),尽量使用同一种方法,以保持代码风格统一。
