Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
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
1
2
3
4
其中EMPTY_LIST實例化了一個EmptyList,EmptyList的源碼如下
private static class EmptyList
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
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)容。