Collection中的size()和isEmpty()區(qū)別說明
Collection中的size()和isEmpty()區(qū)別說明
最近才發(fā)現(xiàn)很多網(wǎng)上的“綱領(lǐng)性”的指導(dǎo)完完全全不能相信,比如有的人說isEmpty()判空性能更好,也有的人拿出源碼說這兩個沒區(qū)別。
Collection集合中有十幾種最終實(shí)現(xiàn)的類,比如HashMap、ArrayList、TreeSet之類的,如何判空這些集合類是最優(yōu)雅,性能最好的呢?真的好想知道,既然網(wǎng)上沒有那只好自己做測試了。
Collection集合類介紹與實(shí)驗(yàn)
測試的集合類
| 類型 | 實(shí)現(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元素時便維護(hù)了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)部維護(hù)了一個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()使用
在實(shí)際的開發(fā)中經(jīng)常要操作list
而為了避免空指針異常,我們經(jīng)常需要進(jìn)行判空操作。一般的寫法是:
if(list!=null && list.size>0){ //進(jìn)行集合的操作 }
- 方法一(數(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坐標(biāo):
<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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot?整合?Fisco?Bcos的案例分析(區(qū)塊鏈)
本篇文章介紹的?Spring?Boot?整合?Fisco?Bcos的案例,是在阿里云服務(wù)器上部署驗(yàn)證的。大家可根據(jù)自己的電腦環(huán)境,對比該案例進(jìn)行開發(fā)即可,具體案例代碼跟隨小編一起看看吧2022-01-01
SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析
這篇文章主要介紹了SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析,如果一個配置類只配置@ConfigurationProperties注解,而沒有使用@Component或者實(shí)現(xiàn)了@Component的其他注解,那么在IOC容器中是獲取不到properties 配置文件轉(zhuǎn)化的bean,需要的朋友可以參考下2024-01-01
Spring Boot 集成 Quartz 使用Cron 表達(dá)式實(shí)現(xiàn)定
本文介紹了如何在SpringBoot項(xiàng)目中集成Quartz并使用Cron表達(dá)式進(jìn)行任務(wù)調(diào)度,通過添加Quartz依賴、創(chuàng)建Quartz任務(wù)、配置任務(wù)調(diào)度以及啟動項(xiàng)目,可以實(shí)現(xiàn)定時任務(wù)的執(zhí)行,Cron表達(dá)式提供了靈活的任務(wù)調(diào)度方式,適用于各種復(fù)雜的定時任務(wù)需求,感興趣的朋友一起看看吧2025-03-03
SpringBoot中@Conditional注解的介紹及實(shí)踐
在 Spring Boot 中,@Conditional 注解用于實(shí)現(xiàn) 條件化 Bean 裝配,本文將詳細(xì)介紹 @Conditional 相關(guān)的注解,并結(jié)合實(shí)際應(yīng)用示例講解其使用方式,感興趣的小伙伴可以了解下2025-03-03
Springboot微服務(wù)分布式框架Rouyi Cloud權(quán)限認(rèn)證(登錄流程之token解析)
這篇文章主要介紹了Springboot微服務(wù)分布式框架Rouyi Cloud權(quán)限認(rèn)證的相關(guān)知識,重點(diǎn)講解下整個框架的入口,登錄流程之token解析,感興趣的朋友跟隨小編一起看看吧2024-04-04

