Collection中的size()和isEmpty()區(qū)別說明
Collection中的size()和isEmpty()區(qū)別說明
最近才發(fā)現(xiàn)很多網(wǎng)上的“綱領(lǐng)性”的指導(dǎo)完完全全不能相信,比如有的人說isEmpty()判空性能更好,也有的人拿出源碼說這兩個沒區(qū)別。
Collection集合中有十幾種最終實現(xiàn)的類,比如HashMap、ArrayList、TreeSet之類的,如何判空這些集合類是最優(yōu)雅,性能最好的呢?真的好想知道,既然網(wǎng)上沒有那只好自己做測試了。
Collection集合類介紹與實驗
測試的集合類
類型 | 實現(xiàn)類 |
---|---|
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()函數(shù),復(fù)雜度為O(1) public int size() { return size; } //HashMap的isEmpty()函數(shù),復(fù)雜度同為O(1) public boolean isEmpty() { return size == 0; }
根據(jù)上述源碼可以看到,HashMap在每次put元素時便維護了size字段,size()==0和isEmpty沒任何性能上的區(qū)別。
List
ArrayList源碼:
//每次添加新的元素的邏輯 public boolean add(E e) { ? ? ensureCapacityInternal(size + 1); ? ? ? elementData[size++] = e; ? ? return true; } //ArrayList的size()函數(shù),復(fù)雜度為O(1) public int size() { return size; } //ArrayList的isEmpty()函數(shù),復(fù)雜度同為O(1) public boolean isEmpty() { return size == 0; }
可以看到,用size()==0和isEmpty()性能上沒任何區(qū)別。
Set
HashSet相對比較簡單,其內(nèi)部維護了一個HashMap而已:
//內(nèi)部聲明的HashMap與其他函數(shù) private transient HashMap<E,Object> map; public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); }
HashSet的size()==0和isEmpty()也沒有任何性能區(qū)別。
list.size()和list.isEmpty()區(qū)別和效率及CollectionUtils.isEmpty()使用
在實際的開發(fā)中經(jīng)常要操作list
而為了避免空指針異常,我們經(jīng)常需要進行判空操作。一般的寫法是:
if(list!=null && list.size>0){ //進行集合的操作 }
- 方法一(數(shù)據(jù)量大,效率低):
if(list!=null && list.size()>0){}
- 方法二(數(shù)據(jù)量大,效率高):
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()){ //對集合的操作 }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring boot+vue 的前后端分離與合并方案實例詳解
這篇文章主要介紹了spring boot+vue 的前后端分離與合并方案實例詳解,需要的朋友可以參考下2017-11-11使用maven對springboot項目進行瘦身分離jar的多種處理方案
springboot項目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個插件默認情況下,會把所有的依賴包全部壓縮到一個jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下2024-02-02Spring 單元測試中如何進行 mock的實現(xiàn)
這篇文章主要介紹了Spring 單元測試中如何進行 mock的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringBoot+Apache tika實現(xiàn)文檔內(nèi)容解析的示例詳解
Apache tika是Apache開源的一個文檔解析工具,本文主要為大家介紹了如何在springboot中引入tika的方式解析文檔,感興趣的小伙伴可以了解一下2023-07-07