当我用Eclipse调试时,为什么arraylist的大小是1但是elementData是10?

时间:2016-07-17 04:00:00

标签: java eclipse debugging arraylist

我想解决这个问题     1 - >一个     2 - >乙     3 - > C     ...     26 - > ž     27 - > AA     28 - > AB 这是我的代码

import java.util.ArrayList;
import java.util.List;

public class Solution {

    public static String convertToTitle(int n) {
        if(n<=0)
            return null;
        List temp=new ArrayList();

        int i=0;
        while(n!=0)
        {
            int residual=0;

            residual=n%26;
            n=n/26;
            temp.add((char)(residual-1+'A'));
            i++;
        }           
        char[] temp_final=new char[i];
        for(int j=0; j<i-1;j++)
            temp_final[j]=(char)(temp.remove(j));
        return String.valueOf(temp_final);
    }

    public static void main(String[] args) {

      String test;
      test=Solution.convertToTitle(2);
      System.out.println(test);
    }
}

结果为null。我不知道原因。当我用Eclipse调试时,我发现temp的大小显示为1,但是在elementData Object中显示了10个元素。第一个元素是B,其他九个是null。为什么它10而不是1?是这个原因吗? 这是调试时的变量图像 enter image description here

2 个答案:

答案 0 :(得分:1)

  

为什么它是10而不是1?

因为这是ArrayList的工作方式!

数组列表将列表存储在后备数组中(elementData)。

使用ArrayList创建new ArrayList()时,初始后备数组大小将为10.(请参阅源代码;例如here。)

为什么他们这样做?

所有关于维护javadoc中所述的保证:

  

&#34;当元素添加到ArrayList时,其容量会自动增长。除了添加元素具有不变的摊销时间成本这一事实之外,未指定增长政策的详细信息。&#34;

实现这一目标的方法是以合理的初始容量&#34;启动支持阵列,并在填满时以指数方式增长阵列。具体细节因Java版本而异。

假设ArrayList类可以使用与列表大小相同的后备数组。但这会带来糟糕的表现。每次向列表中添加元素时,您都需要&#34; grow&#34;支持阵列。这需要分配大小大于当前大小的新数组,然后将现有元素一次一个地复制到新数组。如果您进行数学运算,将元素附加到大小为N的列表涉及复制N现有元素引用...进行追加操作O(N)

答案 1 :(得分:0)

ArrayList是使用数组存储元素的List实现。

在任何时间点,List都有size(),即列表中的元素数量。对于ArrayList,这些元素存储在一个数组中,length大于或等于size() (不能小于或等于size() length,对吗?)

数组ArrayList被称为ArrayList容量,即size可以处理的元素数量,而无需重新调整数组大小

调试器显示elementDatasize数组,但只有数组的第一个ArrayList值在&#34;列表中为#34;。

默认情况下,新ArrayList初始容量为10.在Java 8中,支持数组在需要时将以50%的块大小增加,即10,15 ,22,33,49,73,109,......

如果您知道自己要向 $query = "DELETE modifier_categories,modifier_items FROM modifier_categories INNER JOIN modifier_items ON modifier_items.cat_parent_id = modifier_categories.cat_id WHERE modifier_categories.menu_item_id = $item_id "; 添加1000个元素,则可以在constructor上指定初始容量。这可以防止在添加1000个元素时不断调整阵列大小(性能提升)。