杰瑞科技汇

Java判断String为空,用equals还是isEmpty?

两种“空”的情况

在开始之前,必须明确区分两种情况:

Java判断String为空,用equals还是isEmpty?-图1
(图片来源网络,侵删)
  1. null (空值):这个 String 对象根本不存在,没有指向任何内存地址,试图对 null 调用任何方法都会抛出 NullPointerException (空指针异常)。
  2. (空字符串):这个 String 对象是存在的,但它不包含任何字符,其长度为 0。

一个健壮的判断方法需要同时处理这两种情况。


最经典、最通用的方法 (推荐)

这是最常用、最安全、最推荐的方法,适用于所有 Java 版本。

String str = "some text"; // 或者 str = ""; 或者 str = null;
if (str == null || str.isEmpty()) {
    System.out.println("字符串为 null 或空");
} else {
    System.out.println("字符串不为空且不为 null");
}

代码解析:

  1. str == null:首先检查 str 是否为 null,如果是,整个 if 条件成立,后面的 str.isEmpty() 不会被短路执行,从而避免了 NullPointerException
  2. 逻辑“或”运算符。str == nulltrue,整个表达式直接为 true
  3. str.isEmpty()str 不是 null,再调用 String 类的 isEmpty() 方法检查它是否是空字符串(长度为0)。

优点:

Java判断String为空,用equals还是isEmpty?-图2
(图片来源网络,侵删)
  • 安全:完美处理了 null 和空字符串两种情况。
  • 高效:利用了逻辑或的“短路”特性,性能很好。
  • 可读性高:代码意图非常清晰。

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

如果你使用的是 Java 8 或更高版本,并且喜欢函数式编程风格,可以使用 Optional 来优雅地处理。

Optional 是一个容器对象,它可以包含一个非 null 的值,也可以为空。

import java.util.Optional;
String str = "some text"; // 或者 str = ""; 或者 str = null;
// ofNullable() 会创建一个 Optional:str 为 null,则创建一个空的 Optional;否则创建一个包含 str 的 Optional。
Optional<String> optionalStr = Optional.ofNullable(str);
// optionalStr 中包含值且该值不为空字符串,则 isPresent() 为 true
if (optionalStr.isPresent() && !optionalStr.get().isEmpty()) {
    System.out.println("字符串不为空且不为 null: " + optionalStr.get());
} else {
    System.out.println("字符串为 null 或空");
}

更简洁的写法:

import java.util.Optional;
String str = "some text";
if (Optional.ofNullable(str).map(s -> !s.isEmpty()).orElse(false)) {
    System.out.println("字符串不为空且不为 null");
} else {
    System.out.println("字符串为 null 或空");
}

这段代码的意思是:Optional.ofNullable(str) 创建一个 Optional,然后用 map 对其中的值(如果存在)进行转换(s -> !s.isEmpty()),snullmap 不会执行。orElse(false) 表示如果 Optional 是空的,则返回 false

Java判断String为空,用equals还是isEmpty?-图3
(图片来源网络,侵删)

优点:

  • 显式性:明确表达了“这个值可能为空”的意图。
  • 函数式:符合 Java 8+ 的函数式编程范式,可以链式调用。
  • 避免 NullPointerExceptionOptional 的设计初衷就是为了优雅地处理 null

缺点:

  • 对于这个简单的判断,代码比 if (str == null || str.isEmpty()) 稍显冗长。
  • 如果项目不广泛使用 Optional,可能会增加团队的理解成本。

Apache Commons Lang 工具类

在大型项目中,我们通常会使用 Apache Commons Lang 或 Guava 这样的第三方库,它们提供了很多实用的工具方法。

你需要添加依赖 (Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>

使用 StringUtils 类:

import org.apache.commons.lang3.StringUtils;
String str = "some text"; // 或者 str = ""; 或者 str = null;
if (StringUtils.isEmpty(str)) {
    System.out.println("字符串为 null 或空");
} else {
    System.out.println("字符串不为空且不为 null");
}

StringUtils 还提供了其他有用的方法:

  • StringUtils.isBlank(str):不仅判断 null 和 ,还会判断只包含空白字符(如 , "\t", "\n")的字符串,这在很多场景下非常有用。
  • StringUtils.isNotBlank(str)isBlank 的反义。

优点:

  • 代码简洁:一行代码搞定,可读性极佳。
  • 功能强大:提供了 isBlank 等更贴近业务需求的判断方法。
  • 经过充分测试:作为成熟库,其稳定性和可靠性很高。

缺点:

  • 引入外部依赖:需要为项目添加新的库。

Guava 工具类

与 Apache Commons Lang 类似,Google Guava 也提供了非常优秀的工具类。

添加依赖 (Maven):

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version> <!-- 使用最新版本 -->
</dependency>

使用 Strings 类:

import com.google.common.base.Strings;
String str = "some text"; // 或者 str = ""; 或者 str = null;
if (Strings.isNullOrEmpty(str)) {
    System.out.println("字符串为 null 或空");
} else {
    System.out.println("字符串不为空且不为 null");
}

Guava 的 Strings.isNullOrEmpty() 方法与 Apache 的 StringUtils.isEmpty() 功能完全一样。

优点/缺点:与 Apache Commons Lang 类似,代码简洁,功能强大,但需要引入外部依赖。


总结与推荐

方法 代码示例 优点 缺点 推荐场景
经典 if 判断 if (str == null || str.isEmpty()) 最通用、最安全、性能最好、无需依赖 代码稍长,但意图清晰 所有场景,尤其是没有外部依赖的简单项目或面试
Java 8+ Optional Optional.ofNullable(str).isPresent() && !str.isEmpty() 函数式风格,显式处理 null 对此简单场景略显冗长,团队需熟悉 项目已广泛使用 Optional 和函数式编程
Apache Commons Lang StringUtils.isEmpty(str) 代码最简洁、功能丰富 需要引入 commons-lang3 依赖 大型项目或允许使用第三方库的项目
Google Guava Strings.isNullOrEmpty(str) 代码最简洁、功能丰富 需要引入 guava 依赖 大型项目,特别是已经使用 Guava 其他功能的项目

最终建议:

  • 对于日常开发和学习:强烈推荐使用 if (str == null || str.isEmpty()),这是最基础、最核心、最不会出错的方法。
  • 对于企业级或大型项目:推荐引入 Apache Commons LangGuava,使用 StringUtils.isEmpty()Strings.isNullOrEmpty(),能让代码更简洁、更专业。
  • 如果你是 Java 8+ 的忠实拥护者:可以使用 Optional 来体现函数式编程的思想,但在处理简单判断时,其优势不明显。
分享:
扫描分享到社交APP
上一篇
下一篇