判断java中String、自定义对象、集合为空的方法

一、仅判断是否分配内存

如果仅判断该对象、集合是否已被分配内存(即null还是非null),而不用考虑是否有值,则直接使用 object == null判断即可。

二、如果需进一步判断

要进一步判断该对象值、集合元素是否存在,(或者说当值或元素不存在也判定为空)则继续:

2.1 String判断
如果是String,可以使用StringUtils.isEmpty(),很多框架都提供StringUtils工具类,其中常用的是org.apache.commons.lang3与org.springframework.util提供的StringUtils.isEmpty()。
看下源码就知道两者区别在于:

//lang3
public static boolean isEmpty(CharSequence cs){
    return cs == null || cs.length() == 0;
}
//springframework
public static boolean isEmpty(@Nullable Object str){
    return cs == null || "".equals(str);
}

可以发现,二者都支持null对象的判断,但lang3仅适用于字符串判断,而spring提供的可以对任何Object对象进行判断(事实上…对象啥时候会equals一个空字符串呢,只能判断对象==null,不能判断值是否null)

2.2 自定义对象判断
目前应该是没有提供的工具类来判断自定义对象属性值是否null,org.springframework.util提供的ObjectUtils.isEmpty()方法也不可以判断自定义的对象属性

public static boolean isEmpty(@Nullable Object obj) {
    if (obj == null) {
        return true;
    } else if (obj instanceof Optional) {
        return !((Optional)obj).isPresent();
    } else if (obj instanceof CharSequence) {
        return ((CharSequence)obj).length() == 0;
    } else if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    } else if (obj instanceof Collection) {
        return ((Collection)obj).isEmpty();
    } else {
        return obj instanceof Map ? ((Map)obj).isEmpty() : false;
    }
}

自定义一个工具类,来实现自定义对象属性的判断
https://www.cnblogs.com/DFX339/p/9945771.html?ivk_sa=1024320u

import java.lang.reflect.Field;
import java.lang.reflect.Type;

public class ObjUtils {
    public static boolean objCheckIsNull(Object object){
        Class clazz = (Class)object.getClass(); // 得到类对象
        Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
        boolean flag = true; //定义返回结果,默认为true
        for(Field field : fields){
            field.setAccessible(true);
            Object fieldValue = null;
            try {
                fieldValue = field.get(object); //得到属性值
                Type fieldType =field.getGenericType();//得到属性类型
                String fieldName = field.getName(); // 得到属性名
                System.out.println("属性类型:"+fieldType+",属性名:"+fieldName+",属性值:"+fieldValue);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            //只要有一个属性值不为null 就返回false 表示对象不为null
            if(fieldValue != null){
                flag = false;
                break;
            }
        }
        return flag;
    }
}

测试:

Child child = new Child();
System.out.println(ObjectUtils.isEmpty(child));
System.out.println(ObjUtils.objCheckIsNull(child));
System.out.println(child);

在这里插入图片描述

2.3 集合判断
如果是集合,要使用 == null 先判断,再使用isEmpty()方法判断,避免空指针异常

public class TempTest {
    public static void main(String[] args) {
        ArrayList<String> list = null;
        System.out.println(list.isEmpty());
    }
}

在这里插入图片描述
这里使用ArrayList实现Lis接口的isEmpty()方法,源码如下

public boolean isEmpty() {
    return size == 0;
}

可以看出,不能对空对象进行判断,而只能判断集合中是否存在元素。事实上,类似的isEmpty()方法String中也存在,但都不能判断null值,因为调用的是str.length == 0,同样为null时,报空指针异常。

事实上,org.springframework.util还提供了CollectionUtils工具类,然后调用CollectionUtils.isEmpty()方法来判断集合为null,针对Map和其他集合分别提供isEmpty()方法来判断,并且可以判断集合为null情况,而不会出现空指针异常。

public static boolean isEmpty(@Nullable Collection<?> collection) {
    return collection == null || collection.isEmpty();
}

public static boolean isEmpty(@Nullable Map<?, ?> map) {
    return map == null || map.isEmpty();
}
总结

1、如果仅判断null的情况,不考虑值或元素存在与否,直接使用 == null即可
2、如果将值或元素不存在也看作为空,如果是简单的String,则使用lang3或spring下的StringUtils.isEmpty()都行;而如果是集合,则考虑springframework提供的CollectionUtils.isEmpty()来判断集合。
3、不论是lang3提供的StringUtils还是spring提供的StringUtils、CollectionUtils,它们优点在于不用两次判断(先判断==null,再判断元素),它们提供的isEmpty()方法已经考虑了这两种情况。
4、自定义对象属性为空判断需要自定义工具类来实现。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值