需要一個工具包:
if(userList != null && userList.size() > 0) ===》》 CollectionUtils.isNotEmpty(userList);
public static boolean isEmpty(Collection coll) { return coll == null || coll.isEmpty(); } public static boolean isNotEmpty(Collection coll) { return !isEmpty(coll); } package com.sun.tools.javac.util; public class List<A> extends AbstractCollection<A> implements java.util.List<A> { public A head; public List<A> tail; public boolean isEmpty() { return this.tail == null; } package java.util; public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ public boolean isEmpty() { return size == 0; } } ......... }
list.isEmpty() 和 list.size()==0 有啥區別呢?答案:沒有區別 。
- isEmpty()判斷有沒有元素,而size()返回有幾個元素,
- 如果判斷一個集合有無元素 建議用isEmpty()方法.比較符合邏輯用法。
- 但是直接調用可以會報 nullException。list可能不存在。
- 所以我們需要先判一下null,然后利用 && 短路的特性,A && B ,當A不成立時B不會執行。
在此特別說明一下list!=null和list.size()>0的區別:
- list==null,意味着list壓根沒有地址,在堆內就不存在。
- list.size()=0 意思堆內有list但是還沒來得及放元素,其長度隨着元素數量變化而變化,暫時為零。
- list如果為null的話,說明沒有進行初始化。這是list調用任何的方法都會拋出空異常。list.size()==0說明list已經被new過,但是里面沒有值。
③另外:
list.add(null)
會造成list.isEmpty() 為 false, list.size() 為1
所以代碼里要避免list.add(null)的陷阱
對於ArrayList來講。
- 千萬級別的數據量時,內部迭代要優於外部迭代,單位相差200ms左右 ,並發的相對慢一點。
- 百萬級別的數據量時,外部迭代要優於內部跌代,單位相差50ms左右。並發的要優於普通內部迭代。
- 所以一般使用外部迭代,通過for或者增強for循環
- 對於Java8的stream來講,使用時機,於數據量,機器都有關系。但Stream的出現是面向多核的。