一、简述
1️⃣方法一(数据量大,效率低):
if(list != null && list.size() > 0){}
2️⃣方法二(数据量大,效率高)【最佳】:
if(list != null && !list.isEmpty()){}
方法说明:
①list != null
:判断是否存在 list,null 表示这个 list 不指向任何东西,如果这时候调用它的方法,那么就会出现 NPE(NullPointerException空指针异常)。
②list.isEmpty()
:判断 list 里是否有元素存在。
③list.size()
:判断 list 里有几个元素
二、list != null 和 list.size()>0 的区别
1️⃣list==null
意味着 list 压根没有地址,在堆内就不存在。
2️⃣list.size()==0
意思堆内有 list 但是没有元素,暂时为零。
3️⃣list 如果为 null 的话,说明没有进行初始化。这时 list 调用任何方法都会抛出空指针异常。list.size()==0
说明 list 已经被 new 过,但是里面没有值。
4️⃣区别:
①瓶子存在list != null
②瓶子里没有水list.isEmpty()
判断的时候一定要注意先后顺序。如果连瓶子都没有,直接判断有没有水,是会报java.lang.NullPointerException的。
③另外:list.add(null)
会造成list.isEmpty()
为 false,list.size() 为 1。所以代码里要避免list.add(null)
的陷阱。
④理解:
举个例子,我有一个空着的水杯(list),而你没有,那你是 null,我的 size 为 0。你如果想装水就需要买个水杯(new ArrayList()),而我却可以直接装水(list.add(水))。你要是没有杯子直接倒水,水就会流出(空指针异常)。所以用做判断的时候经常连用list!=null && list.size()!=0
。
三、双重判断原理
List list=new ArrayList();
1️⃣如果是以上这样的话,list 不为 null 但是 size=0,这样集合对于之后的判断是没有意义的,甚至是报异常,如 list.get(0…n) 这样取值判断,就会报异常。
2️⃣如果先判断 size 再判断 null,如:
if(list.size>0 && list != null){};
这种情况如果 list 等于 null 时那么 list.size 会报 NPE。所以要双重判断最好这样写if(list != null && list.size>0){}
至于性能,查看 ArrayList 源码,isEmpty 先获取 size 的值判断再返回,list.size() 则是直接返回属性 size 的值。数据量小时,list.size 较快。(有疑义)
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}