Java 数组列表大小

Java Arraylist size

我在理解 "nested" ArrayList 的 size() 输出时遇到问题:

ArrayList<ArrayList<ArrayList<ArrayList<String>>>> myEmpls = new ArrayList<>();
ArrayList<ArrayList<ArrayList<String>>> dummy2 = new ArrayList<>();
ArrayList<ArrayList<String>> dummy = new ArrayList<>();

        for (int x = 0; x < 4; x++) {
        myEmpls.add(dummy2);
    }

    System.out.println(myEmpls.size());

    // returns 4 as expected

    System.out.println(myEmpls.get(0).size());
    System.out.println(myEmpls.get(1).size());

    // both return 0 as expected

    for (int x = 0; x < 10; x++) {
        myEmpls.get(0).add(dummy);
    }
    System.out.println(myEmpls.get(1).size());

    // returns 10 altough I added to myEmpls.get(0) and not 
    // myEmpls.get(1) so I expected this to still be 0.

有人可以解释为什么会这样吗?也许我遗漏了一些明显的东西。

提前致谢。

您正在将 dummy2 的相同引用添加到 myEmpls 的所有四个位置。因此,当您访问它们中的任何一个时,您访问的对象与具有变量 dummy2 的对象相同,其中实际上有 10 个对象,因为您在其中添加了它。

你甚至可以做到这一点,它也 returns10

System.out.println(dummy2.size());

如果你这样做

for (int x = 0; x < 4; x++) {
    myEmpls.add(new ArrayList<ArrayList<ArrayList<String>>>());
}

它会像您预期的那样运行

myEmpls.add(dummy2); 将相同的 ArrayList 实例添加到 myEmpls 多次。

因此,调用 myEmpls.get(0).add(dummy) 将元素添加到 myEmpls.get(1) 引用的同一 ArrayList 实例。因此 myEmpls.get(1)size() 是 10,因为 myEmpls(0)==myEmpls(1).

如果您将第一个循环更改为:

for (int x = 0; x < 4; x++) {
    dummy2 = new ArrayList<>();
    myEmpls.add(dummy2);
}

myEmpls 的每个元素将是不同的,myEmpls.get(1).size() 将如您预期的那样 return 0。

原因是您创建了一个 ArrayList 对象 (dummy2),然后将该对象添加到列表中 4 次。因此,当您将 dummy 添加到 myEmpls.get(0) 的对象时,您也在向其他 3 个索引添加虚拟对象,因为它们都是同一个对象。因此,大小为 10。myEmpls 中的每个索引都指向内存中完全相同的地址,因此无论您对其中一个索引做什么,都会对所有其他索引做。

List 在其中添加了 Object 的引用,Object 状态的变化反映了在您的情况下 list 中添加的所有引用.

例如:

    ArrayList<List<String>> mainList =new ArrayList<>();
    List<String> test1 =  new ArrayList<>();
    mainList.add(test1);
    mainList.add(test1);
    mainList.add(test1);
    mainList.add(test1);

    System.out.println(mainList);

    test1.add("Hello");//now add item to test1

    System.out.println(mainList);

输出 :

[[], [], [], []]
[[Hello], [Hello], [Hello], [Hello]]