Java中一些常用的判空和数据比对操作

208 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

Java中一些常用的判空和数据比对操作

碎碎念:最近在工作学习中总是难免会碰到一些数据的判空,还有一些对象数据类型的判空和比对操作,就想着在这里一个总结啊,方便自己以后忘记翻看

首先,在介绍判空之前,我觉得首先要明白: 基础数据类型和引用数据类型的区别 👈可以看看我这篇文章

数据结构判空(map、list、set)

org.apache.commons.collections包下的CollectionUtils的方法

CollectionUtils.isEmpty(Collection coll) 为空

源码:

public static boolean isEmpty(Collection coll) {
    return coll == null || coll.isEmpty();
}

CollectionUtils.isNotEmpty(Collection coll) 不为空

源码:

public static boolean isNotEmpty(Collection coll) {
    return !isEmpty(coll);
}

Objects的使用

java.util包下的Objects的方法

Objects.isNull(Object a) 对象为空

源码:

public static boolean isNull(Object obj) {
    return obj == null;
}

Objects.notNull(Object a) 对象不为空

源码:

public static boolean nonNull(Object obj) {
    return obj != null;
}

Objects.equal(Object a, Object b)两个对象是否相同(比对地址)

源码:

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

字符串String的判空和注意

null的情况

public class demo {
    public static void main(String[] args) {
        String a = new String();
        String b = "";
        String c = null;
        test(a);
        test(b);
        test(c);
    }
    private static void test(String str) {
        if (str == null) {
            System.out.println("null");
        }
        if (str.isEmpty()) {
            System.out.println("isEmpty");
        }
        if (str.equals("")) {
            System.out.println("");
        }
        System.out.println("------分割线------");
    }
}

image-20220809000735797

通过这段程序,对三种类型的String字段进行了比较:

  • a 被分配了内存空间且值为空,是一种有值的绝对空
  • b 被分配了内存空间且值为空字符串,是一种有值的相对空
  • c 未分配内存空间且无值,是一种无值状态

所以判断一个 String 变量是否是空对象,应拿其与 null 进行 == 比较,不能使用 equals()、isEmpty()、"" 等进行判断,因为空对象还未被实例化。

String类判空

  1. 而对于 String 的空值判断可以采用三种方法:
  • "".equals(str)比较对象的内容是否为空值
  • length() == 0来判断 String 的字符个数是否空值
  • isEmpty()来判断 String 对象的字符个数是否为空值 (其实现原理等价于 length() == 0)
  1. 对于空格字符串,虽然在输出显示时候和空值一样,都是空的,但是在运行时空格字符串表示该对象的内存空间里面有内容(是空格,字符个数是空格的个数)。

所以在使用 length() 输出的值为空格个数,使用 isEmpty() 输出为 false,使用 “”.equals(str) 判断为 false。

  1. 对于 String 的 + 操作符来说,如果有一个操作数是 String,其他操作数会被转换成 String。

特别注意,null 与字符串 “XXXX” + 操作会变成 “nullXXXX”。

String数据比较

str.equals(“123”) 和 “123”.equals(str) 的区别

"123".equals(str); 因为就算 str 为空,还是会返回 false。但如果用str.equals("123")就会报 NPE。

isEmpty(String str) 和 isBlank(String str) 区别

org.apache.commons.lang.StringUtils 类提供了 String 的常用操作。

最为常用的判空有两种isEmpty(String str) 和 isBlank(String str):

  • 1️⃣StringUtils.isEmpty(String str)

    判断某字符串为空的标准是 【str == null 】或 【str.length() == 0】

  • 2️⃣StringUtils.isBlank(String str)

    判断某字符串为空的标准是 【str == null 】或【str.length() == 0】或【由空白符 (whitespace) 构成】

  • 3️⃣StringUtils.isNotEmpty(String str)

    等价于!isEmpty(String str)

  • 4️⃣StringUtils.isNotBlank(String str)

    等价于!isBlank(String str)

建议: StringUtils.isBlank(String str)来执行判空操作,判断的条件更多更具体,特别是进行参数校验时,推荐使用。

commons-lang3工具包

commons-lang3常用工具方法介绍

使用commons-lang3包的api判空

使用Hutool工具进行判空操作

blog.csdn.net/qq_45415226…

Java8的Optional

Stream流③——Optional判空使用