Java Collections.EMPTY_LIST與Collections.emptyList()的區(qū)別
Collections.EMPTY_LIST與Collections.emptyList()的區(qū)別
Collections.EMPTY_LIST返回的是一個(gè)空的List。為什么需要空的List呢?有時(shí)候我們?cè)诤瘮?shù)中需要返回一個(gè)List,但是這個(gè)List是空的,如果我們直接返回null的話,調(diào)用者還需要進(jìn)行null的判斷,所以一般建議返回一個(gè)空的List。
Collections.EMPTY_LIST返回的這個(gè)空的List是不能進(jìn)行添加元素這類操作的。這時(shí)候你有可能會(huì)說(shuō),我直接返回一個(gè)new ArrayList()唄,但是new ArrayList()在初始化時(shí)會(huì)占用一定的資源,所以在這種場(chǎng)景下,還是建議返回Collections.EMPTY_LIST。
Collections. emptyList()返回的也是一個(gè)空的List,它與Collections.EMPTY_LIST的唯一區(qū)別是,Collections. emptyList()支持泛型,所以在需要泛型的時(shí)候,可以使用Collections. emptyList()。
Collections.EMPTY_MAP和Collections.EMPTY_SET同理。
Collections.EMPTY_LIST的實(shí)現(xiàn)代碼
/** * The empty list (immutable). This list is serializable. * * @see #emptyList() */ @SuppressWarnings("unchecked") public static final List EMPTY_LIST = new EmptyList<>();
Collections. emptyList()的實(shí)現(xiàn)代碼
/** * Returns the empty list (immutable). This list is serializable. * * <p>This example illustrates the type-safe way to obtain an empty list: * <pre> * List<String> s = Collections.emptyList(); * </pre> * Implementation note: Implementations of this method need not * create a separate <tt>List</tt> object for each call. Using this * method is likely to have comparable cost to using the like-named * field. (Unlike this method, the field does not provide type safety.) * * @see #EMPTY_LIST * @since 1.5 */ @SuppressWarnings("unchecked") public static final <T> List<T> emptyList() { return (List<T>) EMPTY_LIST; }
使用Collections.emptyMap()引起的一個(gè)奇怪的問(wèn)題
以下是控制臺(tái)信息
第二行是很不起眼的一條異常信息,不知為何沒(méi)有把整個(gè)錯(cuò)誤堆棧輸出。
一開(kāi)始沒(méi)有注意到這條異常信息,于是設(shè)斷點(diǎn),調(diào)試,結(jié)果每次執(zhí)行幾句就莫名其妙地轉(zhuǎn)入ThreadPoolExecutor中執(zhí)行。
最后注意到上面的異常信息后,發(fā)現(xiàn)對(duì)一個(gè)類型為Map的成員變量初始化有問(wèn)題:
protected Map<String, String> optionalStrParams = Collections.emptyMap();
如此修改:
protected Map<String, String> optionalStrParams = new HashMap<String, String>();
我的本意是初始化為一個(gè)空的Map,EmptyMap在此場(chǎng)景下不合適。
EmptyMap的背景
在某些情況下,我們經(jīng)常需要發(fā)揮一個(gè)空的集合對(duì)象,比如說(shuō)在數(shù)據(jù)查詢時(shí),并不需要發(fā)揮一個(gè)NULL或是異常,那么就可以返回一個(gè)空的集合對(duì)象。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java對(duì)象list使用stream根據(jù)某一個(gè)屬性轉(zhuǎn)換成map的3種方式舉例
開(kāi)發(fā)小伙伴們通常會(huì)需要使用到對(duì)象和Map互相轉(zhuǎn)換的開(kāi)發(fā)場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于java對(duì)象list使用stream根據(jù)某一個(gè)屬性轉(zhuǎn)換成map的3種方式,需要的朋友可以參考下2024-01-01Spring?Boot常用的參數(shù)驗(yàn)證技巧和使用方法
Spring Boot是一個(gè)使用Java編寫的開(kāi)源框架,用于快速構(gòu)建基于Spring的應(yīng)用程序,這篇文章主要介紹了Spring?Boot常用的參數(shù)驗(yàn)證技巧和使用方法,需要的朋友可以參考下2023-09-09Java超詳細(xì)講解設(shè)計(jì)模式中的命令模式
命令模式是將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者對(duì)請(qǐng)求做日志記錄,以及可以支持撤銷的操作2022-04-04詳解Spring AOP的原理與實(shí)現(xiàn)方式
Spring框架是一個(gè)功能強(qiáng)大且靈活的企業(yè)級(jí)應(yīng)用程序開(kāi)發(fā)框架,其中最重要的特性之一就是面向切面編程(AOP),我們今天這篇文章將從源碼和案例的角度詳細(xì)介紹Spring AOP的思想、原理和實(shí)現(xiàn)方式2023-07-07詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別
在?Java?開(kāi)發(fā)中,表達(dá)式語(yǔ)言是一種強(qiáng)大的工具,而SpEL?表達(dá)式與EL?表達(dá)式是我們常常遇到兩種表達(dá)式語(yǔ)言,下面我們就來(lái)看看它們的具體使用與區(qū)別吧2023-07-07java枚舉enum,根據(jù)value值獲取key鍵的操作
這篇文章主要介紹了java枚舉enum,根據(jù)value值獲取key鍵的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02SpringBoot2.x中management.security.enabled=false無(wú)效的解決
這篇文章主要介紹了SpringBoot2.x中management.security.enabled=false無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法
這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08基于SSM框架實(shí)現(xiàn)簡(jiǎn)單的登錄注冊(cè)的示例代碼
這篇文章主要介紹了基于SSM框架實(shí)現(xiàn)簡(jiǎn)單的登錄注冊(cè)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12