Java 空集合使用場景及填坑

今天學學Java中如何創(chuàng)建一個空集合以及空集合的一些使用場景和相關的坑。你可能會問呐籽,這好像沒有什么好講的狡蝶,空集合不就是new一個嘛,也就是像new ArrayList()這樣創(chuàng)建一個不久行了嗎贪惹?其實這也是一種創(chuàng)建空集合的方法,但今天小編講下通過另外一種方式創(chuàng)建空集合枫绅,以及兩種方式之間的差異。

一棵譬、通過Collections.emptyList()創(chuàng)建空集合

Java集合工具類中提供了一系列創(chuàng)建集合的靜態(tài)方法预伺,其中包括創(chuàng)建線程同步相關的Collections.synchronizedXXX()方法酬诀、空集合相關的Collections.emptyXXX()方法。通過這種方式創(chuàng)建的空集合瞒御,既然是空的,就不允許你往集合中添加元素和刪除元素趾唱,也就是不能調用相應add()和remove()方法蜻懦,我先來看看Collections類創(chuàng)建空集合的部分源代碼:

public static final List EMPTY_LIST = new EmptyList<>();......public static final List emptyList() { return (List) EMPTY_LIST;}

你會發(fā)現上面的emptyList()方法默認返回的是前面的靜態(tài)變量EMPTY_LIST,你可能會說宛乃,既然EMPTY_LIST是static的,那我直接通過Collections.EMPTY_LIST獲取不就好了征炼,沒錯谆奥,這樣做也可以眼坏,只不過在某些需要泛型的場景下宰译,調用emptyList()方法提供了相應的泛型支持擂仍。

那為什么這種方式不能添加和移除元素呢熬甚?我們來看看EmptyList內部類是怎么定義的:

// 繼承自AbstractList抽象類private static class EmptyList extends AbstractList implements RandomAccess, Serializable { private static final long serialVersionUID = 8842843931221139166L; public Iterator iterator() { return emptyIterator(); } public ListIterator listIterator() { return emptyListIterator(); } public int size() {return 0;} public boolean isEmpty() {return true;} public boolean contains(Object obj) {return false;} public boolean containsAll(Collection c) { return c.isEmpty(); } public Object[] toArray() { return new Object[0]; } public T[] toArray(T[] a) { if (a.length > 0) a[0] = null; return a; } public E get(int index) { throw new IndexOutOfBoundsException("Index: "+index); } public boolean equals(Object o) { return (o instanceof List) && ((List)o).isEmpty(); } public int hashCode() { return 1; } @Override public boolean removeIf(Predicate filter) { Objects.requireNonNull(filter); return false; } @Override public void replaceAll(UnaryOperator operator) { Objects.requireNonNull(operator); } @Override public void sort(Comparator c) {} // Override default methods in Collection @Override public void forEach(Consumer action) { Objects.requireNonNull(action); } @Override public Spliterator spliterator() { return Spliterators.emptySpliterator(); } // Preserves singleton property private Object readResolve() { return EMPTY_LIST; }}

從上面的源代碼中我們可以發(fā)現EmptyList類并沒有重寫父類相應的add()或者remove()方法乡括,那么當調用空集合的add()方法時將默認調用AbstractList的add()方法智厌,行铣鹏,那么我們來看看父類AbstractList的add()方法是怎么實現的:

public void add(int index, E element) { throw new UnsupportedOperationException();}public E remove(int index) { throw new UnsupportedOperationException();}

很遺憾哀蘑,父類直接給你拋出UnsupportedOperationException異常,所以合溺,小編認為缀台,通過Collections創(chuàng)建的空集合不能添加或刪除元素也是合情合理的,因為是空集合嘛睛约,空哲身,那為啥還要有添加刪除操作。下面說說這種方式的使用場景膀值。

二误辑、簡單使用場景

web開發(fā)中經常使用rest + json的技術組合來進行前后端交互,那么當前端調用一個接口時翘狱,接口有可能需要返回一個空的集合給到前端砰苍,比如你根據某個條件查數據庫得不到數據時,那么此時Collections.emptyXXX()就非常合適了茬缩,因為使用new ArrayList()的初始化還會占用相關的資源吼旧。

為了說明調用add()方法會拋出異常,下面寫個小測試:

public class RemoveIfTest { private static List list = Collections.emptyList(); public static void main(String[] args) { list.add("one1"); list.add("one2"); list.add(1); list.add(2); list.add(new Object()); System.err.println(Arrays.toString(list.toArray())); }}

程序輸出:

Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(Unknown Source) at java.util.AbstractList.add(Unknown Source) at com.example.RemoveIfTest.main(RemoveIfTest.java:17)

三掂为、總結

總的來說,對于如何創(chuàng)建空集合的問題我們不需要糾結昼扛,重要的我們要記住通過Collections.emptyXXX()創(chuàng)建的空集合不能執(zhí)行添加刪除操作以及其中的原理欲诺,避免以后犯錯,不過其實即使你使用錯了斯稳,調試幾遍你的代碼估計也就會把問題發(fā)現出來迹恐,只不過這篇文章能幫你你省去這個發(fā)現bug的過程啦!

如果想學習Java工程化憎茂、高性能及分布式锤岸、深入淺出是偷。微服務、Spring蛋铆,MyBatis,Netty源碼分析的朋友可以加我的Java進階群:617434785留特,群里有阿里大牛直播講解技術玛瘸,以及Java大型互聯網技術的視頻免費分享給大家糊渊。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贺喝,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖针炉,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篡帕,死亡現場離奇詭異,居然都是意外死亡拢军,警方通過查閱死者的電腦和手機怔鳖,發(fā)現死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門结执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懂傀,你說我怎么就攤上這事蜡感。” “怎么了犀斋?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵情连,是天一觀的道長蒙具。 經常有香客問我,道長禁筏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任篱昔,我火速辦了婚禮每强,結果婚禮上始腾,老公的妹妹穿的比我還像新娘。我一直安慰自己空执,他們只是感情好浪箭,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辨绊,像睡著了一般奶栖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上门坷,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天宣鄙,我揣著相機與錄音,去河邊找鬼默蚌。 笑死,一個胖子當著我的面吹牛绸吸,可吹牛的內容都是我干的鼻弧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼锦茁,長吁一口氣:“原來是場噩夢啊……” “哼温数!你這毒婦竟也來了?” 一聲冷哼從身側響起蜻势,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤撑刺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后握玛,有當地人在樹林里發(fā)現了一具尸體够傍,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年挠铲,在試婚紗的時候發(fā)現自己被綠了冕屯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡拂苹,死狀恐怖安聘,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瓢棒,我是刑警寧澤浴韭,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站脯宿,受9級特大地震影響念颈,放射性物質發(fā)生泄漏。R本人自食惡果不足惜连霉,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一榴芳、第九天 我趴在偏房一處隱蔽的房頂上張望嗡靡。 院中可真熱鬧,春花似錦窟感、人聲如沸讨彼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哈误。三九已至,卻和暖如春谍夭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憨募。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工紧索, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菜谣。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓珠漂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尾膊。 傳聞我的和親對象是個殘疾皇子媳危,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發(fā)現冈敛,斷路器待笑,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法抓谴,內部類的語法暮蹂,繼承相關的語法,異常的語法癌压,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 美國調查研究顯示仰泻,50% 的已婚或同居女性比她們的男性伴侶花更多時間照顧下一代,然而只有4% 的男性比他們的女性伴...
    新發(fā)現_新生活_新女性閱讀 683評論 0 0
  • 醉眼微瞇 你入了我的夢 掙扎著想要清醒 看清你秀麗的容顏 天際的微光 穿破了地平線 透過窗戶 直射我的笑臉 如花的...
    浩宇_90閱讀 126評論 0 0