Java数组列表大小
我在理解“嵌套”ArrayList的size()输出时遇到问题:Java数组列表大小,java,arraylist,size,Java,Arraylist,Size,我在理解“嵌套”ArrayList的size()输出时遇到问题: ArrayList<ArrayList<ArrayList<ArrayList<String>>>> myEmpls = new ArrayList<>(); ArrayList<ArrayList<ArrayList<String>>> dummy2 = new ArrayList<>(); ArrayList<Ar
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.
ArrayList myEmpls=new ArrayList();
ArrayList dummy2=新的ArrayList();
ArrayList dummy=新的ArrayList();
对于(int x=0;x<4;x++){
myEmpls.add(dummy2);
}
System.out.println(myEmpls.size());
//按预期返回4
System.out.println(myEmpls.get(0.size());
System.out.println(myEmpls.get(1.size());
//两者都按预期返回0
对于(int x=0;x<10;x++){
myEmpls.get(0).add(dummy);
}
System.out.println(myEmpls.get(1.size());
//返回10 altough我添加到myEmpls.get(0)而不是
//得到(1),所以我希望它仍然是0。
有人能解释为什么会这样吗?也许我错过了一些明显的东西
提前感谢。您正在将相同的
dummy2
引用添加到myEmpls
的所有四个位置。因此,当您访问它们中的任何一个时,您访问的对象与变量dummy2
相同,因为您在其中添加了10个对象
你甚至可以这样做,它也会返回10
System.out.println(dummy2.size());
如果你这样做
for (int x = 0; x < 4; x++) {
myEmpls.add(new ArrayList<ArrayList<ArrayList<String>>>());
}
for(int x=0;x<4;x++){
添加(新的ArrayList());
}
它的行为将与您预期的一样您正在将相同的
dummy2
引用添加到myEmpls
的所有四个位置。因此,当您访问它们中的任何一个时,您访问的对象与变量dummy2
相同,因为您在其中添加了10个对象
你甚至可以这样做,它也会返回10
System.out.println(dummy2.size());
如果你这样做
for (int x = 0; x < 4; x++) {
myEmpls.add(new ArrayList<ArrayList<ArrayList<String>>>());
}
for(int x=0;x<4;x++){
添加(新的ArrayList());
}
它将按照您的预期运行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);
}
for(int x=0;x<4;x++){
dummy2=新的ArrayList();
myEmpls.add(dummy2);
}
myEmpls
的每个元素都将是不同的,myEmpls.get(1).size()
将按预期返回0。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);
}
for(int x=0;x<4;x++){
dummy2=新的ArrayList();
myEmpls.add(dummy2);
}
myEmpls
的每个元素都将是不同的,myEmpls.get(1).size()
将按预期返回0。原因是您创建了一个ArrayList对象(dummy2
),然后将该确切对象添加到列表中4次。因此,当您从myEmpls.get(0)
向对象添加到dummy
时,您也在向其他3个索引添加dummy,因为它们都是相同的对象。因此,尺寸为10。myEmpls中的每个索引都指向内存中完全相同的地址,因此无论您对其中一个索引执行什么操作,都会对其他所有索引执行任何操作。原因是您创建了一个ArrayList对象(dummy2
),然后将该对象添加到列表中4次。因此,当您从myEmpls.get(0)
向对象添加到dummy
时,您也在向其他3个索引添加dummy,因为它们都是相同的对象。因此,尺寸为10。myEmpls中的每个索引都指向内存中完全相同的地址,因此无论您对其中一个索引执行什么操作,都会对其他所有索引执行任何操作。列表保留添加到其中的对象的引用,而对象的状态更改将反映到您案例中添加到列表中的所有引用
例如:
列表保留添加在其中的对象
的引用,对象
状态的更改反映到您案例中添加在列表中的所有引用
例如:
所有的Dummy2不是都一样吗?谢谢所有的答案,我以前确实遇到过同样的问题,但是因为我已经有一段时间没有编码了,所以我没有意识到它!所有的Dummy2不是都一样吗?谢谢所有的答案,我以前确实遇到过同样的问题,但是因为我已经有一段时间没有编码了,所以我没有意识到它!