我有2个arraylist
ArrayList<List<Integer>> main = new ArrayList<>();
ArrayList<Integer> sub=new ArrayList<>();
sub.add(1);
sub.add(2);
main.add(sub);
sub.clear();
sub.add(5);
sub.add(6);
sub.add(7);
main.add(sub);
现在我希望主要是
what i expect main-->[[1,2],[5,6,7]] ;
but really main-->[[567],[567]];
我认为子阵列共享参考..所以我该怎么做
main as [[1,2],[5,6,7]
我无法创建sub1,sub2,...因为实际上我在巨大的循环中执行此操作
答案 0 :(得分:6)
您正在修改列表并再次添加它,这就是为什么[567]出现两次的原因。我建议您更改代码如下:
ArrayList<List<Integer>> main = new ArrayList<>();
ArrayList<Integer> sub = new ArrayList<>();
sub.add(1);
sub.add(2);
main.add(sub);
sub = new ArrayList<>();
sub.add(5);
sub.add(6);
sub.add(7);
main.add(sub);
答案 1 :(得分:2)
您指的是同一个实例
sub.add(1);
sub.add(2);
main.add(sub);
sub.clear(); // you are clearing same instance you added to `main` list
您需要创建新实例
你需要
ArrayList<Integer> sub1 = new ArrayList<>();
sub1.add(1);
sub1.add(2);
main.add(sub1);
ArrayList<Integer> sub2 = new ArrayList<>();
sub2.add(10);
sub2.add(20);
main.add(sub2);
答案 2 :(得分:2)
使用.add函数添加到ArrayList,将相同内存地址的引用添加到ArrayList。
因此,在您的解决方案中,指向sub
指向的内容的引用已添加到ArrayList中。此引用内部指向相同的位置。
现在当你清除'sub'时,实际数据被清除了,因为只有一个数据副本(有两个引用指向它),它就被清除了。
现在当你添加到sub
时,它被添加到两个引用所指向的相同内存位置。因此,您可以在main中看到它的副本。
答案 3 :(得分:1)
你可以clone
像这样的同一个对象:
public static void main(String[] args) {
ArrayList<List<Integer>> main = new ArrayList<List<Integer>>();
ArrayList<Integer> sub=new ArrayList<Integer>();
sub.add(1);
sub.add(2);
main.add(sub);
sub=(ArrayList<Integer>) sub.clone();// clone here
sub.clear();
System.out.println("sub = "+sub);
System.out.println("main = "+main);
sub.add(5);
sub.add(6);
sub.add(7);
main.add(sub);
System.out.println("sub = "+sub);
System.out.println("main = "+main);
}
输出:
sub = []
main = [[1, 2]]
sub = [5, 6, 7]
main = [[1, 2], [5, 6, 7]]
答案 4 :(得分:1)
假设您的Integer
已经在作为“大循环”基础的集合中:
ArrayList<List<Integer> main_list = new ArrayList<>();
Collection<Collection<Integer>> mySubs = xxxx;
for (Collection<Integer> group : mySubs){
List<Integer> sub = new ArrayList<>(group);
main_list.add(sub)
}
所有Collection
类都有可以使用其他Collection
的构造函数
如果您没有现有的收藏品,那么您只需要使用sub.clone().clear()
或sub = new ArrayList<>()