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]]
我在理解 "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]]