arraylist没有按预期工作

时间:2014-10-02 04:22:42

标签: java arraylist

我有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,...因为实际上我在巨大的循环中执行此操作

5 个答案:

答案 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<>()