杰瑞科技汇

Java string判null,用equals还是Objects.equals?

在 Java 中,判断一个 String 对象是否为 null 是一个非常基础且重要的操作,直接使用 或 if 条件语句即可完成。

Java string判null,用equals还是Objects.equals?-图1
(图片来源网络,侵删)

下面我将从基础到进阶,详细解释各种判断方法及其最佳实践。

基础判断:直接使用 if 语句

这是最直接、最常见的方法,当 String 对象为 null 时,在 if 条件中被判断为 false

String myString = null;
if (myString == null) {
    System.out.println("myString 是 null");
} else {
    System.out.println("myString 不是 null,其值为: " + myString);
}
// 输出: myString 是 null

为什么这样可行? 在 Java 中,null 是一个字面量,表示一个不引用任何对象的引用,在布尔上下文中(如 if 条件),null 会被自动转换为 false,任何非 null 的对象引用都会被转换为 true


判断空字符串

除了判断 null,我们还需要判断字符串是否为空,即长度为 0 的字符串 。

Java string判null,用equals还是Objects.equals?-图2
(图片来源网络,侵删)

使用 String.length()

length() 方法返回字符串中的字符数,空字符串的长度为 0

String emptyString = "";
if (emptyString.length() == 0) {
    System.out.println("emptyString 是空字符串");
}
// 输出: emptyString 是空字符串

使用 String.isEmpty()

isEmpty() 方法是 Java 6 引入的,专门用于判断字符串是否为空,它比 length() == 0 更具可读性,是更推荐的方式。

Java string判null,用equals还是Objects.equals?-图3
(图片来源网络,侵删)
String emptyString = "";
if (emptyString.isEmpty()) {
    System.out.println("emptyString 是空字符串");
}
// 输出: emptyString 是空字符串

判断 null 或空字符串

在实际开发中,我们经常需要同时判断一个字符串是否为 null 或者是否为空字符串,这是最常见的场景。

使用 if 语句(推荐)

这是最清晰、最不容易出错的方式,也是所有 Java 开发者都能看懂的标准写法。

String str = null; // 或者 String str = ""; 或者 String str = "Hello";
if (str == null || str.isEmpty()) {
    System.out.println("字符串为 null 或空");
} else {
    System.out.println("字符串有内容: " + str);
}

为什么是 (OR) 而不是 && (AND)?

  • if (str == null || str.isEmpty()):意思是 "strnull 或者 str 是空字符串"。
  • 短路求值str == null 的结果是 true,Java 就不会去执行后面的 str.isEmpty(),从而避免了在 strnull 时调用方法而导致的 NullPointerException,这是这种写法安全的关键。

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

如果你正在使用这些流行的库,可以使用它们提供的工具类,代码会更简洁。

// 需要 Apache Commons Lang 依赖
// import org.apache.commons.lang3.StringUtils;
String str = null;
// isBlank() 不仅判断 null 和 "",还会判断 "   " (只有空格的字符串)
if (StringUtils.isBlank(str)) {
    System.out.println("字符串为 null、空或仅包含空白字符");
}
// isEmpty() 只判断 null 和 ""
if (StringUtils.isEmpty(str)) {
    System.out.println("字符串为 null 或空");
}

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

Optional 是 Java 8 引入的容器类,用于优雅地处理可能为 null 的值,可以避免显式的 null 检查。

import java.util.Optional;
String str = null;
// 使用 Optional.ofNullable() 创建一个 Optional 对象
// str 为 null,则创建一个空的 Optional
// str 不为 null,则创建一个包含 str 的 Optional
boolean isNullOrEmpty = Optional.ofNullable(str).isEmpty();
if (isNullOrEmpty) {
    System.out.println("字符串为 null 或空");
}

或者更传统一点的 Optional 用法:

String str = null;
Optional<String> optionalStr = Optional.ofNullable(str);
if (optionalStr.isEmpty()) { // 或者 !optionalStr.isPresent()
    System.out.println("字符串为 null 或空");
}

常见错误:NullPointerException

绝对不要这样做:

String str = null;
// 错误写法!这会抛出 NullPointerException
if (str.isEmpty()) {
    // ...
}

原因分析:

  1. str 的值是 null
  2. isEmpty() 是一个实例方法,需要通过一个对象来调用。
  3. 尝试在 null 引用上调用方法,JVM 无法找到该方法所属的对象,因此会抛出 NullPointerException

判断 null、空字符串 和纯空格字符串

我们需要判断一个字符串是否“没有实际内容”,这包括 null、 和 。

使用 String.trim()

trim() 方法会移除字符串首尾的空白字符(包括空格、制表符、换行符等),如果字符串只包含空白字符,trim() 后会变成空字符串 。

String str = "   ";
if (str == null || str.trim().isEmpty()) {
    System.out.println("字符串为 null、空或仅包含空白字符");
}
// 输出: 字符串为 null、空或仅包含空白字符

使用 StringUtils.isBlank() (推荐)

如前所述,Apache Commons Lang 的 StringUtils.isBlank() 方法正是为此设计的,它内部也使用了 trim(),但代码更简洁。

// import org.apache.commons.lang3.StringUtils;
String str = "   ";
if (StringUtils.isBlank(str)) {
    System.out.println("字符串为 null、空或仅包含空白字符");
}

总结与最佳实践

场景 推荐写法 说明
仅判断 null if (str == null) 基础、直接。
仅判断空字符串 if (str.isEmpty()) str.length() == 0 更可读。
判断 null if (str == null || str.isEmpty()) 最常用、最推荐的标准写法,清晰且安全。
判断 null、 或 if (str == null || str.trim().isEmpty()) 标准写法。
判断 null、 或 if (StringUtils.isBlank(str)) 最佳实践(如果允许引入第三方库),代码更简洁,意图更明确。
函数式风格 if (Optional.ofNullable(str).isEmpty()) Java 8+ 风格,适合函数式编程,但可读性可能略逊于标准写法。

核心要点:

  1. 永远不要在可能为 null 的对象上直接调用方法。
  2. 总是先检查 null,再检查其内容(如 isEmpty())。
  3. str == null || str.isEmpty() 是判断字符串是否为空或为 null 的黄金标准,请牢记。
  4. 如果你的项目允许使用 Apache Commons Lang 或 Spring,StringUtils.isBlank() 是处理这类问题的首选工具。
分享:
扫描分享到社交APP
上一篇
下一篇