鉴于以下代码:
List<Object> arrayList = new ArrayList<Object>();
for(int counter=0; counter < 100; counter++) {
arrayList.add(null);
}
除了实例化并且大小为100之外,&#34; arrayList&#34;从一个实际上为空的List?
好奇。
感谢。
答案 0 :(得分:1)
首先要做的事情是:ArrayList<...>
不是数组,ArrayList
更复杂,但使用数组作为后备数据结构。
现在回答你的问题:我想到的两个主要区别是:
null
的引用比大小为100的实际ArrayList
消耗更少的内存。请注意,引用的大小相同,但指向null
的引用不指向分配内存。对于包含100个ArrayList
条目的null
,所有对100个emelemts的引用都存在,但引用null
,使其消耗更多内存。您无法在null
上调用方法:
List<Object> list1 = new ArrayList<Object>(100);
list1.size(); // totally fine, will return 0
List<Object> list2 = null;
list2.size(); // throws a NullPointerException
答案 1 :(得分:1)
很简单。如果您的ArrayList
为null,则它只是一个空对象引用,就像任何其他引用一样(指定了特定类型)。
如果你有一个ArrayList
个100个空元素,那么它是一个完全实例化的ArrayList
封装100个空对象引用。
功能,您可以在不生成异常的情况下引用这100个空引用中的任何一个。使用null ArrayList
,任何访问列表特定成员的尝试都将产生异常。
实际上,就像背景资料一样,从任何返回集合的方法返回实例化集合通常是个好主意。它允许调用代码一般枚举集合,即使它包含任何它应该包含的零实例。当然,意见可能会有所不同。 ; - )
答案 2 :(得分:0)
如果已定义其变量但尚未将其声明为新的ArrayList,则列表将为null。
List<String> nullList;
List<String> emptyList = new ArrayList<String>();
//empty list has been defined as a new ArrayList so it is not null, however it is empty because it has no elements
emptyList.add(null);
//empty list is still empty since all values are null
所以这样做:
nullList == null
会返回true,但是:
emptyList == null
将返回false