英文:
ArrayList inside an ArrayList in java
问题
我在使用Java时遇到了一个问题,需要使用嵌套的ArrayList,并且在每次迭代后都必须清除内部列表。我注意到,当我将内部列表添加到主列表中并稍后清除内部列表时,主列表的值也发生了变化。是否有人可以解释一下这为什么会发生?另外,如果我使用数组而不是ArrayList,是否会有任何变化?我已经附上了我的问题的代码如下:
import java.util.*;
import java.lang.*;
import java.io.*;
class Example
{
public static void main(String []args){
ArrayList<ArrayList<Integer>> list= new ArrayList<>();
ArrayList<Integer> innerlist = new ArrayList<>();
innerlist.add(1);
list.add(innerlist);
System.out.println(list);
innerlist.clear();
System.out.println(list);
}
}
输出:
[[1]]
[[]]
英文:
I came across a problem in which I had to use nested ArrayList in java and had to clear the innerlist after each iteration. I noticed that when I added the innerlist to the main list and cleared the innerlist later , the value of the main list changed . Can anyone please explain why this is happening . Also , will there be any change if I use array instead of ArrayList. I have attached the code to my problem below to make it clear.
import java.util.*;
import java.lang.*;
import java.io.*;
class Example
{
public static void main(String []args){
ArrayList<ArrayList<Integer>> list= new ArrayList<>();
ArrayList<Integer> innerlist = new ArrayList<>();
innerlist.add(1);
list.add(innerlist);
System.out.println(list);
innerlist.clear();
System.out.println(list);
}
}
Output :
[1]
[[]]
答案1
得分: 0
innerlist
仍然指向 ArrayList。
英文:
innerlist
is pointing still pointing to the ArrayList.
Check this:
https://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy
答案2
得分: 0
这是因为 add
操作并不会复制任何内容 - 它只是将你传递给它作为参数的对象的引用添加到列表的末尾。如果你希望对 innerlist
引用的更改不会影响到你的 list
,你需要对其进行复制,例如使用接受集合参数的构造函数。你可以在添加时进行如下操作:
list.add(new ArrayList<>(innerlist));
或者在添加后重新将 innerlist
赋值为一个新的列表:
list.add(innerlist);
innerlist = new ArrayList<>();
特别是在这一点上,如果你需要清空它的话。
另请参阅这个问题,它处理了相同的问题,但没有使用外部列表。
英文:
This is happening because add
doesn't copy anything - it just adds a reference to the object you pass as parameter to the end of the list. If you want that changes to the innerlist
reference don't affect your list
at all, you need to copy it, for example using the constructor taking a Collection parameter. You can do this either when adding
list.add(new ArrayList<>(innerlist));
or you reassign innerlist
to a new list after adding
list.add(innerlist);
innerlist = new ArrayList<>();
especially if you need to clear it anyway at that point.
See also this question, which handles the same problem, but without an outer list.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论