携手创作,共同成长!这是我参与「掘金日新计划 · 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("------分割线------");
}
}
通过这段程序,对三种类型的String字段进行了比较:
- a 被分配了内存空间且值为空,是一种有值的绝对空
- b 被分配了内存空间且值为空字符串,是一种有值的相对空
- c 未分配内存空间且无值,是一种无值状态
所以判断一个 String 变量是否是空对象,应拿其与 null 进行 == 比较,不能使用 equals()、isEmpty()、"" 等进行判断,因为空对象还未被实例化。
String类判空
- 而对于 String 的空值判断可以采用三种方法:
"".equals(str)比较对象的内容是否为空值length() == 0来判断 String 的字符个数是否空值isEmpty()来判断 String 对象的字符个数是否为空值 (其实现原理等价于 length() == 0)
- 对于空格字符串,虽然在输出显示时候和空值一样,都是空的,但是在运行时空格字符串表示该对象的内存空间里面有内容(是空格,字符个数是空格的个数)。
所以在使用 length() 输出的值为空格个数,使用 isEmpty() 输出为 false,使用 “”.equals(str) 判断为 false。
- 对于 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包的api判空