杰瑞科技汇

Java String 判断值有哪些方法?

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

Java String 判断值有哪些方法?-图1
(图片来源网络,侵删)
  1. 是否为空? (包括 null 和 )
  2. 是否为空白? (包括 null、 和 )
  3. 是否等于某个特定字符串? (区分大小写)
  4. 是否在忽略大小写的情况下等于某个特定字符串?
  5. 是否包含某个子串?
  6. 是否以某个前缀/后缀开头或结尾?

判断 String 是否为空或空白

这是最常见的需求,但也是最容易出错的地方,我们需要区分“空”和“空白”。

a. 判断是否为 "null" 或空字符串

一个 String 变量,如果它没有被赋值,它的值就是 null,如果它被赋值为 ,那么它是一个长度为 0 的空字符串。

❌ 错误的写法(会导致 NullPointerException

String str = null;
if (str.length() == 0) { // 这里会抛出 NullPointerException
    System.out.println("字符串为空");
}

✅ 正确的写法(推荐使用 java.util.Objects 工具类)

Java String 判断值有哪些方法?-图2
(图片来源网络,侵删)

从 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 (最常用)

Java String 判断值有哪些方法?-图3
(图片来源网络,侵删)

这是一个非常流行的第三方库,强烈推荐在项目中使用。

<!-- 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")

核心建议:

  1. 处理空值和空白是第一要务:在进行任何字符串操作前,先判断它是否为 null 或空白,这是健壮代码的关键。
  2. 拥抱 StringUtils:如果你的项目允许引入第三方库,Apache Commons LangStringUtils 是处理字符串的瑞士军刀,能极大提升代码的简洁性和可读性。
  3. 了解你的 Java 版本:如果你在使用 Java 11+,多利用 String 类自带的 isBlank()lines()strip() 等新方法,它们非常方便。
  4. 保持一致性:在同一个项目中,对于同一种判断(比如判断是否为空),尽量使用同一种方法,以保持代码风格统一。
分享:
扫描分享到社交APP
上一篇
下一篇