一、仅判断是否分配内存

如果仅判断该对象、集合是否已被分配内存(即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; //定义返回结果,默认为truefor(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 表示对象不为nullif(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、自定义对象属性为空判断需要自定义工具类来实现。

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

  1. java object大小_在Java中,确定对象object大小的最佳方法是什么? - Break易站

    例如,假设我有一个应用程序,它可以读取包含一堆数据行的CSV文件.我根据数据类型向用户提供行数摘要,但是我想确保不读取太多数据行并导致OutOfMemoryErrors.每一行都会翻译成一个对象.有没 ...

  2. 判断java中两个对象是否相等

    一.java中的基本数据类型(int.double.short.long.byte.float.boolean.char)判断是否相等,直接使用"=="就行了,相等返回true,否 ...

  3. java integer 值传递_在java中String,对象,Integer(包装类型的)关于引用传递仍是值传递...

    场景: 你们都知道基本的数据类型,int,float等等这种是按值传递的.可是对于String,对象,Integer是怎样传递呢?java 原理知识: 若是参数类型是原始类型,那么传过来的就是这个参数 ...

  4. java integer引用传递_在java中String,对象,Integer(包装类型的)关于引用传递还是值传递...

    场景: 大家都知道基本的数据类型,int,float等等这种是按值传递的.但是对于String,对象,Integer是怎样传递呢? 原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副 ...

  5. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  6. java中String类型对象在克隆时候的特殊性

    查看原码可知 String类型被final所修饰,不可对它的实例进行修改 即:String类型的实例是一个常量,跟八大基本类型 int .double等一样 但根据我们所学到的,String是一个引用 ...

  7. Java中String转int类型出现的问题及解决方式

    一般在Java中String转为Int主要有两种方法: 1. Integer.parseInt(str); 2. Integer.valueOf(str); ps:两者的不同之处: Integer.p ...

  8. java基础—TreeSet集合中储存自定义对象(java集合二)

    TreeSet集合中储存学生对象,按照其年龄进行排序 TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法. TreeSe ...

  9. java判断一个对象是否为空_Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...

最新文章

  1. pythonide机制_强化vim打造python的IDE
  2. 数据结构链表之队列,Python3实现——7
  3. sysbench数据库性能压测详解
  4. 【iOS开发】An Apple ID with identifier xxxis not available. Please enter a different string.
  5. pyqt5设置dialog的标题_Python GUI教程(一):在PyQt5中创建第一个GUI图形用户界面...
  6. 小辣椒android密码怎样开,小辣椒手机忘记密码怎么恢复出厂设置
  7. struts2框架之拦截器(参考第二天学习笔记)
  8. python自制懒人听书
  9. synchronized偏向锁
  10. 代码审查codereview工具
  11. 国庆节上映的电影有哪些?2014国庆节上映的动画电影盘点
  12. java线程池newfi_Java进阶——线程与多线程
  13. visio跨职能流程图带区背景及大小及改变格式 (转)
  14. 伦敦经济学院开设加密货币相关课程
  15. WinMail邮件服务器(客户端)环境搭建与配置
  16. 网格搜索(调参)与数据预处理
  17. 计算机图形学 使用OpenGL的场景建模
  18. 第二章第二十二题(金融应用:货币单位)(Financial application: monetary units)
  19. python职业规划书_基于Python数据分析做职业规划
  20. oracle通过用户名查看表空间,Oracle 查询登陆用户名属于哪个表空间

热门文章

  1. 【深度学习】常见优化器的PyTorch实现
  2. 【技术干货】TC基础与自动化
  3. Wireshark对HTTPS数据的解密
  4. 视频内容理解在Hulu的应用与实践
  5. 腾讯面试后续 | 掘金技术征文
  6. SQL Server物化视图学习笔记
  7. J2SE核心开发实战(二)——字符串与包装类
  8. 淮南:发力“大数据”能源城激活新动能
  9. 2013年2月最后一周
  10. 为何出现Error Loading Midas.dll消息?