杰瑞科技汇

Java String null 判断,该用 == 还是 equals?

null vs. (空字符串)

在开始判断之前,必须清楚区分两个概念:

Java String null 判断,该用 == 还是 equals?-图1
(图片来源网络,侵删)
  • null: 这表示变量没有引用任何对象,它不是一个有效的 String 对象,如果你尝试对 null 调用任何方法(如 .length().equals()),都会抛出 NullPointerException (空指针异常)。
  • (空字符串): 这是一个有效的 String 对象,但它不包含任何字符,它的长度是 0,你可以安全地对它调用任何 String 类的方法。

示例代码:

String str1 = null;       // str1 是一个 null 引用
String str2 = "";         // str2 是一个空字符串对象
String str3 = "hello";    // str3 是一个正常的字符串对象
// 下面这些操作会抛出 NullPointerException
// System.out.println(str1.length());
// System.out.println(str1.equals(""));
// 下面这些操作是安全的
System.out.println(str2.length()); // 输出 0
System.out.println(str2.isEmpty()); // 输出 true

判断方法

根据你的具体需求(是否需要同时判断 null 和空字符串),有以下几种主流的判断方法。


基础 if 判断 (最直接)

这是最基础、最直观的方法,适合初学者理解。

场景1:只判断是否为 null

Java String null 判断,该用 == 还是 equals?-图2
(图片来源网络,侵删)
String str = null;
if (str == null) {
    System.out.println("字符串是 null");
} else {
    System.out.println("字符串不是 null");
}

场景2:判断是否为 null 或空字符串

String str = "";
if (str == null || str.equals("")) {
    System.out.println("字符串是 null 或空字符串");
} else {
    System.out.println("字符串有内容");
}

注意:这里必须把 str == null 放在前面,因为如果 strnull,后面的 str.equals("") 就不会执行,从而避免了 NullPointerException


使用 String.isEmpty() (推荐)

String.isEmpty() 是 Java 6 引入的一个方法,它比 str.equals("") 更清晰、更高效(它内部直接检查 value.length == 0),它只检查字符串是否为空,不会检查 null

场景:判断是否为 null 或空字符串

Java String null 判断,该用 == 还是 equals?-图3
(图片来源网络,侵删)

这是最常用和推荐的做法之一,因为它意图非常明确。

String str = null;
if (str == null || str.isEmpty()) {
    System.out.println("字符串是 null 或空字符串");
} else {
    System.out.println("字符串有内容");
}

优点

  • 可读性强isEmpty() 这个方法名清楚地表达了意图。
  • 性能稍好isEmpty() 是一个本地方法(native method),通常比创建一个新字符串 再用 equals() 比较要快一点点。

使用 StringUtils (来自 Apache Commons Lang 或 Spring Framework)

在实际项目中,我们经常会使用第三方库提供的工具类,它们提供了更强大的功能。

Apache Commons Lang 的 StringUtils

你需要添加依赖:

<!-- Maven -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

StringUtils.isEmpty(String str) 这个方法同时判断 null 和空字符串 。

import org.apache.commons.lang3.StringUtils;
String str1 = null;
String str2 = "";
String str3 = "hello";
System.out.println(StringUtils.isEmpty(str1)); // true
System.out.println(StringUtils.isEmpty(str2)); // true
System.out.println(StringUtils.isEmpty(str3)); // false

StringUtils.isBlank(String str) (更强大) 这个方法不仅能判断 null 和 ,还能判断只包含空白字符(如空格 \s, 制表符 \t, 换行符 \n 等)的字符串,在很多业务场景下,这是最符合需求的判断。

import org.apache.commons.lang3.StringUtils;
String str1 = null;
String str2 = "";
String str3 = "   ";
String str4 = " hello ";
String str5 = "";
System.out.println(StringUtils.isBlank(str1)); // true
System.out.println(StringUtils.isBlank(str2)); // true
System.out.println(StringUtils.isBlank(str3)); // true (只包含空格)
System.out.println(StringUtils.isBlank(str4)); // false (包含非空白字符)
System.out.println(StringUtils.isBlank(str5)); // true

Spring Framework 的 StringUtils

如果你已经在使用 Spring Framework,可以直接使用 org.springframework.util.StringUtils

import org.springframework.util.StringUtils;
String str = "  ";
// hasText() 同时检查 null, "" 和 "   "
if (!StringUtils.hasText(str)) {
    System.out.println("字符串为 null、空或仅包含空白字符");
}

注意:Spring 的 StringUtils.isEmpty(str) 只判断 null 和 ,而 StringUtils.hasText(str) 功能与 Apache 的 isBlank() 类似。


Java 8+ 的 Optional (函数式风格)

Java 8 引入了 Optional,它是一个容器对象,可能包含或不包含非 null 值,使用 Optional 可以优雅地处理 null 值,避免显式的 null 检查。

场景:安全地获取字符串长度

import java.util.Optional;
String str = null;
// 使用 Optional.ofNullable 包装可能为 null 的字符串
// str 为 null,则得到一个空的 Optional
// str 不为 null,则得到一个包含 str 的 Optional
Optional<String> optionalStr = Optional.ofNullable(str);
// 如果存在值,则执行操作
optionalStr.ifPresent(s -> {
    System.out.println("字符串的长度是: " + s.length());
});
// 如果不存在值(即原字符串为 null),则执行 orElse 中的操作
String result = optionalStr.orElse("默认值");
System.out.println("处理后的结果是: " + result); // 输出: 处理后的结果是: 默认值

优点

  • 代码更健壮:强制开发者思考“当值为 null 时该怎么办”。
  • 链式调用:可以和 Stream API 结合,写出更函数式的代码。

缺点

  • 对于简单的 null 判断,可能会显得有些“重”,不如直接 if 判断简洁。

总结与最佳实践

方法 判断 null 判断 判断 推荐场景
str == null 只需要判断 null 的情况。
str.isEmpty() 需要判断 null 和 时的首选,可读性高。
StringUtils.isEmpty() 已引入 Apache Commons Lang 时的标准做法。
StringUtils.isBlank() 业务判断的首选,当用户输入可能为空格、Tab时,这个方法最可靠。
Optional.ofNullable() Java 8+ 函数式编程风格,用于优雅地处理 null 和提供默认值。

最终建议:

  1. 如果你只需要判断 null:直接使用 if (str == null)
  2. 如果你需要判断 null 或空字符串 强烈推荐使用 if (str == null || str.isEmpty()),这是最清晰、最标准、不依赖任何库的写法。
  3. 如果你的项目已经引入了 Apache Commons Lang 或 Spring:并且你的业务逻辑需要将 视为无效输入,请毫不犹豫地使用 StringUtils.isBlank(str),这是处理用户输入等场景的最佳实践。
  4. 如果你在编写函数式风格的代码:并且想避免 NullPointerException,可以探索使用 Optional
分享:
扫描分享到社交APP
上一篇
下一篇