2014-05-18 37 views
4

我有以下代码:添加值以列出初始化列表大小

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时,当I HV intitilzed临时变量,在那里的对象的大小为0,如下showm:

enter image description here

但只要我添加即temp.add大小为1,但目标是创造12个,其中11个值均为空,如下图所示...我无法理解这里的空值的原因任何人都可以plz exaplin ... mi初始化错误?

enter image description here

enter image description here

+0

可你尝试连接的ArrayList的源和调试中'ArrayList'的构造和'加()'和从看到它从10 –

回答

2

ArrayList是一个dynamic array,这意味着它随着元素的添加而增长。但它不会改变它的大小“一个接一个”。它的大小增加了一个“合理的”数量,因此每次添加元素时都不会重复调整列表大小的操作,因为这样效率不高。

+0

,所以我去12不能摆脱那个空值? – KOTIOS

+0

不,因为它是'ArrayList'内部实现的业务。 – Christian

+0

好的,但我仍然不清楚它需要arrylistModel变量的大小,即使我添加新的模型() – KOTIOS

1

原因null值,是因为这是如何ArrayList的内心本性的工作。他们从里面开始一个空白数组,当你添加东西时,他们会根据自己的喜好调整自己的尺寸。数组大于放入的对象数量的原因是因为每次添加内容时调整数组的大小效率会非常低,所以ArrayList实现者只是使内部数组以一定的大小和大约每次需要调整大小时,它都是双倍大小。他们通过跟踪单独的size变量来跟踪您输入的元素数量。

换句话说,你正在初始化事情就好了。不要担心ArrayList的内部结构 - 如果您查看内部size变量,您会发现它是1,就像您期望的那样。

0

从Java Dokumentation: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组大小。它总是至少与列表大小一样大。随着元素被添加到ArrayList,其容量会自动增长。增长政策的细节并未超出添加元素具有不变摊销时间成本的事实。

缺省容量是某种方式12中的情况下,即使它应该是10

+0

你从哪里得到它的12?只是问,因为根据JDK 7,默认容量是10.为什么它可能与OP的代码不同?也许是版本? – Christian

+0

不知道,其实。也许它在调整大小后是12 ... – Sergey

+0

我已经用Java 1.7对它进行了测试,并且我得到了'10'作为默认值。 – Christian

1
ArrayList

Collections框架的数据结构,其是建立在阵列顶部即它的实现是在数组的帮助下完成的。由于大小要在数组中定义,所以它首先将大小初始化为10,即。当您添加值时,它将成为第11个项目。

现在你可能会想知道这个动态是如何工作的,当尺寸达到极限时,它会创建一个新的数组,两倍大小,复制旧的东西并丢弃prev数组。会建议你看看执行情况。

对用户来说,它看起来像动态的,但是当你通过调试器看时,你会看到空值。数组起始于0到10,这使得11个元素和新添加的项目变为12,但对于公共API,它仍然是第一个元素。

入住这里完整实现的ArrayList:link