1. 程式人生 > 實用技巧 >if(list != null && list.size() > 0)優化,集合判空優雅的實現方式

if(list != null && list.size() > 0)優化,集合判空優雅的實現方式

需要一個工具包:

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的區別:

  1. list==null,意味著list壓根沒有地址,在堆內就不存在。
  2. list.size()=0 意思堆內有list但是還沒來得及放元素,其長度隨著元素數量變化而變化,暫時為零。
  3. list如果為null的話,說明沒有進行初始化。這是list呼叫任何的方法都會丟擲空異常。list.size()==0說明list已經被new過,但是裡面沒有值。

③另外:
list.add(null)
會造成list.isEmpty() 為 false, list.size() 為1
所以程式碼裡要避免list.add(null)的陷阱

對於ArrayList來講。

  1. 千萬級別的資料量時,內部迭代要優於外部迭代,單位相差200ms左右 ,併發的相對慢一點。
  2. 百萬級別的資料量時,外部迭代要優於內部跌代,單位相差50ms左右。併發的要優於普通內部迭代。
  3. 所以一般使用外部迭代,通過for或者增強for迴圈
  4. 對於Java8的stream來講,使用時機,於資料量,機器都有關係。但Stream的出現是面向多核的。