JavaArrayList<>()和Collections.emptyList()的区别

网友投稿 599 2022-05-30

一、先看源码

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

构造一个具有指定初始容量的空列表。

参数:

initialCapacity – 列表的初始容量

抛出:

IllegalArgumentException – 如果指定的初始容量为负

这里我们可以发现,如果初始化的size是0,就会得到一个EMPTY_ELEMENTDATA。

2.Collections.emptyList()

Collections类官方的注释是这样的

此类仅包含对集合进行操作或返回集合的静态方法。它包含对集合进行操作的多态算法、“包装器”,它返回由指定集合支持的新集合,以及其他一些零碎的东西。

如果提供给它们的集合或类对象为空,则该类的方法都将抛出 NullPointerException。

此类中包含的多态算法的文档通常包括对实现的简要说明。此类描述应被视为实现说明,而不是规范的一部分。只要遵守规范本身,实现者应该可以随意替换其他算法。 (例如,sort 使用的算法不一定是归并排序,但它必须是稳定的。)

此类中包含的“破坏性”算法,即修改它们操作的集合的算法,如果集合不支持适当的变异原语(例如 set 方法),则指定为抛出 UnsupportedOperationException。如果调用对集合没有影响,则这些算法可能(但不是必需)抛出此异常。例如,对已排序的不可修改列表调用 sort 方法可能会也可能不会抛出 UnsupportedOperationException。

Collections是聚合的工具类,我们调用的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

53

54

55

56

57

58

59

60

61

62

63

二、相同和不同

1.相同点

【Java】ArrayList<>()和Collections.emptyList()的区别

很显然,ArrayList<>()和Collections.emptyList()得到的结果是一样的,都是空的ArrayList。

2.不同点

Collections.emptyList()在源码注释中提到,他是类型安全不可变的空列表。

ArrayList<>()则是没有定义长度的列表,也就是说他的长度是可变的,并不是完全为了返回空列表准备。

从前面的源码看,如果定义的时候确定size设置为0,就会运行

this.elementData = EMPTY_ELEMENTDATA;

1

这样就会得到一个元素都空的列表了。

3.ArrayList<>()做了什么

ArrayList<>()会在内存开辟空间,以便准备写入后续可能写入的数据。

4.Collections.emptyList()

Collections.emptyList()则不会,从上面的源码看,他是Collections的内部类,并不会占用多余的内存。

三、总结

如果你想返回空列表,希望你使用Collections.emptyList(),因为这样能够更少的减少内存浪费。

遇到问题多看看源码,答案就在问题里。

Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring5.0入门级案例(入门小白专属)
下一篇:python中的函数参数
相关文章