JavaArrayList<>()和Collections.emptyList()的區(qū)別

      網(wǎng)友投稿 725 2025-03-31

      一、先看源碼


      1.ArrayList<>()

      public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      構(gòu)造一個具有指定初始容量的空列表。

      參數(shù):

      initialCapacity – 列表的初始容量

      拋出:

      IllegalArgumentException – 如果指定的初始容量為負(fù)

      這里我們可以發(fā)現(xiàn),如果初始化的size是0,就會得到一個EMPTY_ELEMENTDATA。

      2.Collections.emptyList()

      Collections類官方的注釋是這樣的

      此類僅包含對集合進(jìn)行操作或返回集合的靜態(tài)方法。它包含對集合進(jìn)行操作的多態(tài)算法、“包裝器”,它返回由指定集合支持的新集合,以及其他一些零碎的東西。

      如果提供給它們的集合或類對象為空,則該類的方法都將拋出 NullPointerException。

      此類中包含的多態(tài)算法的文檔通常包括對實現(xiàn)的簡要說明。此類描述應(yīng)被視為實現(xiàn)說明,而不是規(guī)范的一部分。只要遵守規(guī)范本身,實現(xiàn)者應(yīng)該可以隨意替換其他算法。 (例如,sort 使用的算法不一定是歸并排序,但它必須是穩(wěn)定的。)

      此類中包含的“破壞性”算法,即修改它們操作的集合的算法,如果集合不支持適當(dāng)?shù)淖儺愒Z(例如 set 方法),則指定為拋出 UnsupportedOperationException。如果調(diào)用對集合沒有影響,則這些算法可能(但不是必需)拋出此異常。例如,對已排序的不可修改列表調(diào)用 sort 方法可能會也可能不會拋出 UnsupportedOperationException。

      Collections是聚合的工具類,我們調(diào)用的emptyList()的源碼如下

      @SuppressWarnings("unchecked") public static final List emptyList() { return (List) EMPTY_LIST; }

      1

      2

      3

      4

      其中EMPTY_LIST實例化了一個EmptyList,EmptyList的源碼如下

      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; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      【Java】ArrayList<>()和Collections.emptyList()的區(qū)別

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      二、相同和不同

      1.相同點

      很顯然,ArrayList<>()和Collections.emptyList()得到的結(jié)果是一樣的,都是空的ArrayList。

      2.不同點

      Collections.emptyList()在源碼注釋中提到,他是類型安全不可變的空列表。

      ArrayList<>()則是沒有定義長度的列表,也就是說他的長度是可變的,并不是完全為了返回空列表準(zhǔn)備。

      從前面的源碼看,如果定義的時候確定size設(shè)置為0,就會運行

      this.elementData = EMPTY_ELEMENTDATA;

      1

      這樣就會得到一個元素都空的列表了。

      3.ArrayList<>()做了什么

      ArrayList<>()會在內(nèi)存開辟空間,以便準(zhǔn)備寫入后續(xù)可能寫入的數(shù)據(jù)。

      4.Collections.emptyList()

      Collections.emptyList()則不會,從上面的源碼看,他是Collections的內(nèi)部類,并不會占用多余的內(nèi)存。

      三、總結(jié)

      如果你想返回空列表,希望你使用Collections.emptyList(),因為這樣能夠更少的減少內(nèi)存浪費。

      遇到問題多看看源碼,答案就在問題里。

      Java

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:word2013怎么將表格轉(zhuǎn)換文本(word把文本轉(zhuǎn)換為表格)
      下一篇:word2003中表格和文字如何互換
      相關(guān)文章
      亚洲理论片在线中文字幕| 久久精品国产亚洲AV无码娇色 | 亚洲黄色网站视频| 亚洲国产一二三精品无码| 久久亚洲国产精品五月天婷| 亚洲第一网站男人都懂| 无码欧精品亚洲日韩一区夜夜嗨| 激情无码亚洲一区二区三区| 亚洲精品无码mⅴ在线观看| 亚洲欧美日韩中文二区| 亚洲日韩中文字幕一区| 亚洲精品乱码久久久久久蜜桃图片| 亚洲综合色一区二区三区| 亚洲明星合成图综合区在线| 91亚洲自偷在线观看国产馆| 亚洲一级免费视频| 日本亚洲色大成网站www久久| 亚洲精品天堂在线观看| 亚洲熟妇AV乱码在线观看| 亚洲人成电影网站色| 日韩在线视精品在亚洲| 亚洲精品高清在线| 自拍偷自拍亚洲精品情侣| 日本红怡院亚洲红怡院最新| 亚洲视频在线一区| 亚洲免费在线观看视频| 亚洲日韩国产AV无码无码精品| 亚洲精品无码mⅴ在线观看| 亚洲成AV人网址| 亚洲中文字幕在线乱码| 亚洲AV无码专区电影在线观看 | 亚洲国产精品lv| 亚洲乱人伦精品图片| 亚洲一卡一卡二新区无人区| 亚洲一线产区二线产区区| 国产精品亚洲专一区二区三区| 亚洲午夜精品久久久久久浪潮| 亚洲日韩aⅴ在线视频| 日韩精品亚洲人成在线观看| 亚洲免费黄色网址| 亚洲AV永久无码精品放毛片|