我的代码如下:
Hashtable<Integer, List<Model>> map = new Hashtable<Integer, List<Model>>();
for (int i = 0; i < arraylistAssignment.size(); i++) {
List<Model> temp = null;
for (int j = 0; j < arraylistModel.size(); j++) {
if (arraylistAssignment.get(i).getId() == arraylistModel.get(j)
.getId()) {
if (temp == null)
temp = new ArrayList<Model>();// DEBUG POINT 1
temp.add(arraylistModel.get(j));
}// DEBUG POINT 2 AFTER ADD FUNCTION ABOVE
}
map.put(arraylistAssignment.get(i).getId(), temp);
}
在调试点1的上述代码中,当我对temp变量进行了内部化处理时,对象大小为0,如下面的showm所示:
但是一旦我添加ie temp.add,大小为1但是对象创建的是12个,其中11个值为null,如下所示...我无法理解空值的原因,这里任何人都可以使用exzlin。 ..mi initilzing错误?
答案 0 :(得分:2)
ArrayList
是dynamic array,这意味着它会随着元素的添加而增长。但它并没有一个一个地改变它的大小&#34; 。它的大小增长了#34;合理的&#34; amount,因此每次添加元素时都不会重复调整列表大小的操作,因为这样效率很低。
答案 1 :(得分:1)
null
值的原因是因为ArrayList
在内部的工作方式。他们从内部开始使用空白数组,当你添加东西时,他们会根据自己的需要调整自己的大小。数组大于您放入的对象数的原因是因为每次添加内容时调整数组的大小效率非常低,因此ArrayList
实现者只是使内部数组开始于每次需要调整大小时,其大小和大小都要大一倍。它们通过跟踪单独的size
变量来跟踪您放入的元素数量。
换句话说,你正在初始化事情就好了。不要担心ArrayList
的内部 - 如果你看一下内部size
变量,你会发现它是1
,就像你期望的那样。
答案 2 :(得分:1)
ArrayList
是Collections
框架中的数据结构,它构建在数组I.e之上。它的实现是在数组的帮助下完成的。由于要在数组中定义大小,首先将大小初始化为10 。添加值时,它将成为第11项。
现在你可能想知道这是如何动态以及它是如何工作的,当大小达到其极限时,它会创建一个大小翻倍的新数组,复制旧的东西并丢弃prev数组。建议你看一下实现。
对于用户来说,它看起来像动态,但是当你查看调试器时,你会看到空值。 Array STARTS在0到10之间,它使11个元素和你新添加的项目变成第12个但是对于公共api,它仍然是第一个元素。
点击此处查看ArrayList的完整实现:link
答案 3 :(得分:0)
来自Java Dokumentation: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList时,其容量会自动增加。除了添加元素具有恒定的摊销时间成本这一事实之外,未指定增长政策的细节。
默认容量在某种情况下是12,即使它应该是10。