杰瑞科技汇

Java判断Object为空有哪些方法?

在 Java 中判断一个 Object 是否为“空”是一个常见的需求,但“空”的定义取决于具体场景,它可能指以下几种情况:

Java判断Object为空有哪些方法?-图1
(图片来源网络,侵删)
  1. 对象引用为 null:这是最直接、最明确的“空”。
  2. 为空
    • String 对象是空字符串 。
    • Collection (如 List, Set) 或 Map 对象不包含任何元素。
    • 数组 [] 的长度为 0。
    • 自定义对象的所有字段都是默认值(int 为 0,booleanfalse,对象引用为 null)。

下面我将分情况详细介绍如何判断,并提供最佳实践和工具类推荐。


判断对象引用是否为 null

这是最简单、最基础的情况,直接使用 操作符即可。

Object myObject = null;
if (myObject == null) {
    System.out.println("对象引用为 null");
} else {
    System.out.println("对象引用不为 null");
}

要点

  • 永远不要使用 equals() 方法来判断 nullmyObjectnull,调用 myObject.equals(...) 会立即抛出 NullPointerException
  • 用于比较基本类型时比较值,用于比较对象引用时比较的是它们是否指向内存中的同一个对象,对于 null 这是判断引用是否为空的正确且高效的方式。

判断对象内容是否为空

这种情况更复杂,需要根据对象的具体类型来处理。

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

A. 判断 String 是否为空

String 为空通常指 (长度为 0),有时也需要考虑是否为 null

直接判断长度

String str = null;
// 推荐:先判断非 null,再判断长度
if (str != null && str.isEmpty()) {
    System.out.println("字符串为 null 或空字符串");
}
// 或者分开判断
if (str == null) {
    System.out.println("字符串为 null");
} else if (str.isEmpty()) {
    System.out.println("字符串为空");
}

String.isEmpty() 方法在 String 对象不为 null 时调用是安全的。

使用 StringUtils (Apache Commons Lang) 这是业界非常推荐的做法,代码更简洁。

import org.apache.commons.lang3.StringUtils;
String str = "";
if (StringUtils.isEmpty(str)) {
    // StringUtils.isEmpty() 会同时判断 null 和 ""
    System.out.println("字符串为 null 或空字符串");
}
if (StringUtils.isBlank(str)) {
    // StringUtils.isBlank() 除了判断 null 和 "",还会判断只包含空白字符的字符串,如 "   "
    System.out.println("字符串为 null、空或纯空白");
}

Maven 依赖:

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

B. 判断 Collection (List, Set) 或 Map 是否为空

集合为空通常指集合本身不为 null,且不包含任何元素。

标准写法

import java.util.List;
import java.util.Map;
import java.util.Set;
List<String> myList = null;
Map<String, Integer> myMap = new HashMap<>();
// 推荐:先判断非 null,再判断集合的 size
if (myList != null && myList.isEmpty()) {
    System.out.println("List 为 null 或空");
}
// 更健壮的写法
if (myList == null || myList.isEmpty()) {
    System.out.println("List 为 null 或空");
}

Collection.isEmpty()Map.isEmpty() 方法在集合对象不为 null 时调用是安全的。

使用 CollectionUtils (Apache Commons Collections) 同样可以使代码更优雅。

import org.apache.commons.collections4.CollectionUtils;
List<String> myList = null;
if (CollectionUtils.isEmpty(myList)) {
    // CollectionUtils.isEmpty() 会同时判断 null 和 size == 0
    System.out.println("List 为 null 或空");
}

Maven 依赖:

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

C. 判断数组是否为空

数组为空通常指数组本身不为 null,且其长度为 0。

String[] myArray = null;
// 推荐:先判断非 null,再判断长度
if (myArray != null && myArray.length == 0) {
    System.out.println("数组为 null 或空数组");
}
// 更健壮的写法
if (myArray == null || myArray.length == 0) {
    System.out.println("数组为 null 或空数组");
}

判断自定义对象是否为“空”

对于自定义的 Java 对象,“空”没有一个标准定义,你需要根据业务逻辑来决定。

常见定义:一个对象的所有字段都处于其“默认”或“初始”状态。

示例: 假设有一个 User 类:

public class User {
    private Long id;
    private String name;
    private Integer age;
    // 构造器、getters 和 setters...
}

如何判断 User 对象为空?

手动逐个判断字段

public boolean isUserEmpty(User user) {
    if (user == null) {
        return true;
    }
    // 判断所有关键字段是否为默认值
    // Long 的默认值是 null
    // String 的默认值是 null
    // Integer 的默认值是 null
    return user.getId() == null && user.getName() == null && user.getAge() == null;
}
// 使用
User user = new User();
if (isUserEmpty(user)) {
    System.out.println("User 对象为空(所有字段均为默认值)");
}

使用反射(通用但性能较差) 如果不想为每个类都写一个判断方法,可以使用反射来检查所有字段。

import java.lang.reflect.Field;
public boolean isObjectEmpty(Object obj) {
    if (obj == null) {
        return true;
    }
    try {
        for (Field field : obj.getClass().getDeclaredFields()) {
            field.setAccessible(true); // 允许访问私有字段
            Object value = field.get(obj);
            // 如果有一个字段不是默认值,则对象不为空
            if (value != null) {
                return false;
            }
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        // 可以根据需要处理异常,例如返回 false
        return false;
    }
    // 所有字段都是默认值,则对象为空
    return true;
}

注意:反射方法性能较低,不适合在性能敏感的频繁调用的代码中使用。


总结与最佳实践

场景 推荐方法 代码示例
判断引用为 null 使用 if (obj == null)
判断 String 使用 StringUtils.isEmpty() StringUtils.isEmpty(str)
判断 Collection/Map 使用 CollectionUtils.isEmpty()obj != null && obj.isEmpty() CollectionUtils.isEmpty(list)
判断数组 obj != null && obj.length == 0 if (array == null || array.length == 0)
判断自定义对象 根据业务逻辑,手动编写判断方法或使用反射(性能慎用) return user.getId() == null && ...

核心原则

  1. 明确“空”的定义:在编写代码前,先想清楚你所说的“空”具体指什么。
  2. 防御性编程:始终先检查 null,再调用对象的方法,以避免 NullPointerException
  3. 使用工具类:对于 StringCollection 等常见类型,优先使用 Apache Commons 等成熟库提供的工具方法,它们经过充分测试,代码更简洁、可读性更高。
  4. 保持一致性:在整个项目中,对于“空”的判断标准应保持一致。
分享:
扫描分享到社交APP
上一篇
下一篇