杰瑞科技汇

Java如何高效判断String是否为空?

核心概念:区分 null 和 空字符串

在开始之前,必须明确两个概念:

Java如何高效判断String是否为空?-图1
(图片来源网络,侵删)
  1. null: 表示这个 String 变量没有引用任何对象,它不是一个有效的字符串。
  2. 空字符串 : 表示这是一个有效的 String 对象,但它内部不包含任何字符(长度为 0)。

一个常见的错误是直接对一个可能为 null 的字符串调用方法,str.length()str.equals(""),这会抛出 NullPointerException


使用 StringUtils (Apache Commons Lang / Spring) - 推荐

这是最常用、最简洁、最安全的方法,它已经为你处理了所有边界情况(null、、空白字符串等)。

你需要先添加依赖:

Maven:

Java如何高效判断String是否为空?-图2
(图片来源网络,侵删)
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>

Gradle:

implementation 'org.apache.commons:commons-lang3:3.12.0' // 使用最新版本

1. 判断 null 或 (最常用)

使用 StringUtils.isEmpty()

import org.apache.commons.lang3.StringUtils;
public class StringUtilsExample {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "  ";
        String str4 = "Hello";
        // 判断是否为 null 或 空字符串 ""
        System.out.println("str1 is empty: " + StringUtils.isEmpty(str1)); // true
        System.out.println("str2 is empty: " + StringUtils.isEmpty(str2)); // true
        System.out.println("str3 is empty: " + StringUtils.isEmpty(str3)); // false (因为 str3 是 "  ", 不为空)
        System.out.println("str4 is empty: " + StringUtils.isEmpty(str4)); // false
    }
}

2. 判断 null、 或 (包含空白字符)

使用 StringUtils.isBlank(),这在表单验证等场景中非常有用,可以判断用户是否只输入了空格或制表符。

import org.apache.commons.lang3.StringUtils;
public class StringUtilsExample {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "   ";
        String str4 = "  Hello  ";
        String str5 = "Hello";
        // 判断是否为 null, "" 或 "   "
        System.out.println("str1 is blank: " + StringUtils.isBlank(str1)); // true
        System.out.println("str2 is blank: " + StringUtils.isBlank(str2)); // true
        System.out.println("str3 is blank: " + StringUtils.isBlank(str3)); // true
        System.out.println("str4 is blank: " + StringUtils.isBlank(str4)); // false (因为 str4 包含非空白字符)
        System.out.println("str5 is blank: " + StringUtils.isBlank(str5)); // false
    }
}

优点:

Java如何高效判断String是否为空?-图3
(图片来源网络,侵删)
  • 简洁: 一行代码搞定,可读性高。
  • 安全: 内部已经处理了 null 检查,不会抛出 NullPointerException
  • 功能强大: isBlank() 方法特别实用。

缺点:

  • 需要引入第三方库。

使用 Java 8+ 的 Optional - 现代、函数式风格

如果你使用的是 Java 8 或更高版本,Optional 是一个很好的选择,它能更优雅地处理可能为 null 的值。

1. 判断 null

import java.util.Optional;
public class OptionalExample {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "Hello";
        // Optional.ofNullable() 可以安全地包装可能为 null 的对象
        // str 为 null, Optional 会是 Optional.empty()
        // filter() 会保留满足条件的元素,否则返回 Optional.empty()
        // isPresent() 检查是否有值
        boolean isStr1Empty = Optional.ofNullable(str1).filter(String::isEmpty).isPresent();
        boolean isStr2Empty = Optional.ofNullable(str2).filter(String::isEmpty).isPresent();
        boolean isStr3Empty = Optional.ofNullable(str3).filter(String::isEmpty).isPresent();
        System.out.println("str1 is empty: " + isStr1Empty); // true
        System.out.println("str2 is empty: " + isStr2Empty); // true
        System.out.println("str3 is empty: " + isStr3Empty); // false
    }
}

优点:

  • 函数式风格: 代码更声明式,易于组合。
  • 显式: 明确表示该变量可能为空,增强了代码的可读性。

缺点:

  • 略显复杂: 对于简单的 null/空判断,Optional 的语法比 StringUtils 稍显冗长。
  • 开销: 创建 Optional 对象有微小的性能开销(在绝大多数情况下可以忽略)。

手动实现 (不使用第三方库)

如果你不能或不想引入外部库,可以手动编写判断逻辑。

1. 判断 null

这是最基础、最核心的判断方式。

public class ManualCheckExample {
    public static boolean isEmpty(String str) {
        // 1. 先判断 str 是否为 null,防止 NPE
        // 2. 再判断 str.length() 是否为 0
        return str == null || str.length() == 0;
    }
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "Hello";
        System.out.println("str1 is empty: " + isEmpty(str1)); // true
        System.out.println("str2 is empty: " + isEmpty(str2)); // true
        System.out.println("str3 is empty: " + isEmpty(str3)); // false
    }
}

2. 判断 null、 或 (包含空白字符)

public class ManualCheckExample {
    public static boolean isBlank(String str) {
        if (str == null || str.length() == 0) {
            return true;
        }
        // 遍历字符串,检查每个字符是否都是空白字符
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "   ";
        String str4 = "  Hello  ";
        System.out.println("str1 is blank: " + isBlank(str1)); // true
        System.out.println("str2 is blank: " + isBlank(str2)); // true
        System.out.println("str3 is blank: " + isBlank(str3)); // true
        System.out.println("str4 is blank: " + isBlank(str4)); // false
    }
}

优点:

  • 无依赖: 不需要任何外部库。
  • 透明: 逻辑完全在自己的控制之下。

缺点:

  • 代码冗长: 需要自己编写和维护代码,容易出错(比如忘记 null 检查)。
  • 重复: 如果在多个地方使用,会造成代码重复。

Java 11+ 的 isBlank()isEmpty() - 官方解决方案

Java 11 开始,String 类本身新增了两个非常实用的方法!这是最标准、最现代的方式。

1. isEmpty() - 判断 null

注意: String.isEmpty() 本身不能处理 null,所以必须先用 Objects.requireNonNullObjects.isNull 等工具类,或者结合 Optional

import java.util.Objects;
public class Java11Example {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "Hello";
        // 必须先检查 null
        boolean isStr1Empty = str1 == null || str1.isEmpty();
        boolean isStr2Empty = str2 == null || str2.isEmpty();
        boolean isStr3Empty = str3 == null || str3.isEmpty();
        System.out.println("str1 is empty: " + isStr1Empty); // true
        System.out.println("str2 is empty: " + isStr2Empty); // true
        System.out.println("str3 is empty: " + isStr3Empty); // false
    }
}

2. isBlank() - 判断 null、 或 (推荐!)

同样,String.isBlank() 也不能直接用于 null,最佳实践是将其封装在一个工具方法中。

import java.util.Objects;
public class Java11Example {
    // 封装一个安全的方法来处理 null 和 isBlank
    public static boolean isBlank(String str) {
        return str == null || str.isBlank();
    }
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "";
        String str3 = "   ";
        String str4 = "  Hello  ";
        System.out.println("str1 is blank: " + isBlank(str1)); // true
        System.out.println("str2 is blank: " + isBlank(str2)); // true
        System.out.println("str3 is blank: " + isBlank(str3)); // true
        System.out.println("str4 is blank: " + isBlank(str4)); // false
    }
}

优点:

  • 官方标准: 无需引入任何外部库,是 Java 语言的一部分。
  • 性能: 通常由 JVM 优化,性能很好。
  • 可读性: str.isBlank() 非常直观。

缺点:

  • 版本限制: 需要 Java 11 或更高版本。

总结与最佳实践

场景 推荐方法 代码示例
项目允许使用第三方库 StringUtils.isEmpty() / isBlank() StringUtils.isBlank(myString)
项目不允许使用第三方库 & Java 11+ String.isBlank() + 手动 null 检查 myString == null || myString.isBlank()
项目不允许使用第三方库 & Java 8-10 手动实现 isEmpty() / isBlank() myString == null || myString.length() == 0
函数式编程风格 & Java 8+ Optional.ofNullable().filter().isPresent() Optional.ofNullable(myString).filter(String::isEmpty).isPresent()

我的建议:

  1. 首选 StringUtils.isBlank():在绝大多数项目中,引入 commons-lang3 是一个值得的投资,它的 isBlank() 方法是处理字符串空白的“黄金标准”,既安全又方便。
  2. 如果使用 Java 11+,拥抱标准库:将 myString == null || myString.isBlank() 写成一个工具方法,然后在项目中复用,这是未来的趋势。
  3. 避免直接使用 str == "":这种方法虽然可行,但不够健壮,如果字符串是通过 new String("") 创建的, 会返回 false,而 str.length() == 0str.isEmpty() 是判断内容为空的最佳方式。
  4. 永远不要忘记 null 检查:除非你 100% 确定字符串不会为 null,否则在调用任何 String 方法之前,一定要先处理 null 的情况。
分享:
扫描分享到社交APP
上一篇
下一篇