Collection中的size()和isEmpty()區別說明
Collection中的size()和isEmpty()區別說明
最近才發現很多網上的“綱領性”的指導完完全全不能相信,比如有的人說isEmpty()判空性能更好,也有的人拿出源碼說這兩個沒區別。
Collection集合中有十幾種最終實現的類,比如HashMap、ArrayList、TreeSet之類的,如何判空這些集合類是最優雅,性能最好的呢?真的好想知道,既然網上沒有那隻好自己做測試瞭。
Collection集合類介紹與實驗
測試的集合類
類型 | 實現類 |
---|---|
Map | HashMap、TreeMap、LinkedHashMap |
List | ArrayList |
Set | HashSet、TreeSet、LinkedHashSet |
Map
HashMap源碼:
//每次put元素 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //省略N行代碼... ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; } //HashMap的size()函數,復雜度為O(1) public int size() { return size; } //HashMap的isEmpty()函數,復雜度同為O(1) public boolean isEmpty() { return size == 0; }
根據上述源碼可以看到,HashMap在每次put元素時便維護瞭size字段,size()==0和isEmpty沒任何性能上的區別。
List
ArrayList源碼:
//每次添加新的元素的邏輯 public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } //ArrayList的size()函數,復雜度為O(1) public int size() { return size; } //ArrayList的isEmpty()函數,復雜度同為O(1) public boolean isEmpty() { return size == 0; }
可以看到,用size()==0和isEmpty()性能上沒任何區別。
Set
HashSet相對比較簡單,其內部維護瞭一個HashMap而已:
//內部聲明的HashMap與其他函數 private transient HashMap<E,Object> map; public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); }
HashSet的size()==0和isEmpty()也沒有任何性能區別。
list.size()和list.isEmpty()區別和效率及CollectionUtils.isEmpty()使用
在實際的開發中經常要操作list
而為瞭避免空指針異常,我們經常需要進行判空操作。一般的寫法是:
if(list!=null && list.size>0){ //進行集合的操作 }
- 方法一(數據量大,效率低):
if(list!=null && list.size()>0){}
- 方法二(數據量大,效率高):
if(list!=null && !list.isEmpty()){}
查看ArrayList源碼如下
不明白為什麼說有效率差距(就先姑且這麼記吧,無奈)。
public int size() { return size; } public boolean isEmpty() { return size == 0; }
大部分框架都會提供CollectionUtils這樣的工具類
比如spring框架
包路徑如下:
package org.springframework.util.CollectionUtils;
使用工具類以後的集合判空操作就簡潔瞭不少:
if(CollectionUtils.isEmpty()){ //對集合的操作 }
再比如Apache提供的CollectionUtils工具類
maven坐標:
<dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency>
包路徑:
package org.apache.commons.collections;
使用工具類以後的集合判空操作就簡潔瞭不少:
if(CollectionUtils.isEmpty()){ //對集合的操作 }
或者
if(CollectionUtils.isNotEmpty()){ //對集合的操作 }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決CollectionUtils.isNotEmpty()不存在的問題
- Java中關於size()>0 和isEmpt()的性能考量
- Java十分鐘精通集合的使用與原理上篇
- Springboot如何優雅地進行字段校驗
- 一篇文章帶你入門java集合