[英]Adding value to list initialize list size
我有下面的代码:
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,如下所示...我无法理解空值的原因在这里可以任何人plz exaplin ... mi启蒙错误?
ArrayList
是一个动态数组 ,这意味着它随着元素的添加而增长。 但它并没有“逐个”改变它的大小。 它的大小增加了“合理”的数量,因此每次添加元素时都不会重复调整列表大小的操作,因为这样效率很低。
null
值的原因是因为ArrayList
在内部的工作方式。 他们从内部开始使用空白数组,当你添加东西时,他们会根据自己的需要调整自己的大小。 数组大于您放入的对象数的原因是因为每次添加内容时调整数组的大小效率非常低,因此ArrayList
实现者只是使内部数组以一定的大小开始每次需要调整大小时,它的大小加倍。 它们通过跟踪单独的size
变量来跟踪您放入的元素size
。
换句话说,你正在初始化事情就好了。 不要担心ArrayList
的内部 - 如果你看一下内部size
变量,你会发现它是1
,就像你期望的那样。
ArrayList
是Collections
框架中的一个数据结构,它构建在数组之上,即它的实现是在数组的帮助下完成的。 由于要在数组中定义大小 , 因此它首先将大小初始化为10 。 添加值时,它将成为第11项。
现在你可能想知道它是如何动态的以及它是如何工作的,当大小达到它的极限时它会创建一个大小翻倍的新数组,复制旧的东西并丢弃prev数组。 建议你看一下实现。
对于用户来说,它看起来像动态,但是当你查看调试器时,你会看到空值。 Array STARTS在0到10之间,它使11个元素和你新添加的项目变成第12个但是对于公共api,它仍然是第一个元素。
请在此处查看ArrayList: link的完整实现
来自Java Dokumentation: http : //docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
每个ArrayList实例都有一个容量。 容量是用于存储列表中元素的数组的大小。 它始终至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增加。 除了添加元素具有恒定的摊销时间成本这一事实之外,未指定增长策略的详细信息。
默认容量在某种程度上是12,在你的情况下,即使它应该是10。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.