有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为列表添加值初始化列表大小

我有以下代码:

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,如下所示:

enter image description here

但只要我加上临时工。添加大小为1,但创建的对象为12,其中11个值为空,如下所示。。。我不明白这里空值的原因,有人能帮我检查一下吗。。。我开始错了吗

enter image description here

enter image description here


共 (4) 个答案

  1. # 1 楼答案

    ArrayListCollections框架中的一种数据结构,它构建在数组之上,也就是说,它的实现是在数组的帮助下完成的。由于大小是在数组中定义的,它首先将大小初始化为10。添加值时,它将成为第11项

    现在你可能想知道这个动态过程是怎样的,它是如何工作的,当大小达到极限时,它会创建一个新的数组,大小是原来的两倍,复制旧的内容并丢弃上一个数组。我建议你看看实施情况

    对于用户来说,它看起来像是动态的,但当您查看调试器时,会看到空值。数组从0到10开始,这意味着它有11个元素,新添加的项变成了第12个元素,但对于公共api,它仍然是第一个元素

    在这里查看ArrayList的完整实现:link

  2. # 2 楼答案

    之所以使用null值,是因为ArrayList在内部是这样工作的。它们从内部的空白数组开始,当你添加内容时,它们会根据自己的需要调整大小。数组大于您放入的对象数的原因是,每次添加内容时调整数组的大小效率很低,因此ArrayList实现者只是让内部数组以特定的大小开始,每次需要调整大小时,其大小大约是原来的两倍。它们通过跟踪一个单独的size变量来跟踪你输入了多少元素

    换句话说,你初始化的东西很好。不要担心ArrayList的内部——如果查看内部size变量,就会发现它是1,正如您所期望的那样

  3. # 3 楼答案

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

  4. # 4 楼答案

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

    每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少和列表大小一样大。随着元素添加到ArrayList,其容量会自动增长。除了增加一个要素具有恒定的摊余时间成本这一事实之外,没有具体说明增长政策的细节

    在你的情况下,默认容量是12,尽管它应该是10