int []数组的数组列表

时间:2018-10-11 02:49:22

标签: java arraylist

我正在尝试一个简单的代码,但我不知道出了什么问题。我试图将int []数组添加到ArrayList中。它被正确添加。但是,一旦ArrayList中有多个元素,列表中的每个元素都会被最新值替换。我尝试查找可能的错误,但找不到任何错误。我在这里提供我的代码和输出,以便我可以帮助您找出代码中的错误。

代码:

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;

public class main {

    public static void main(String[] args) {
        ArrayList<int[]> outer = new ArrayList<int[]>(); 
        int[] list = new int[7];
        int total = 2;
        int l = 3;
        SecureRandom rand = new SecureRandom();
        for (int i = 0; i < total; i++)
        {
            if((i+1) % l == 0)
            {
                list = new int[7];
                outer = new ArrayList<int[]>();
            }
            else {
                for(int j = 0; j < 7; j++)
                {
                    int num = rand.nextInt(100);
                    list[j] = num;
                }
                System.out.println(Arrays.toString(list));
                outer.add(list);
                System.out.println(outer.size());
                System.out.println(i);
                System.out.println(Arrays.toString(outer.get(i)));
            }
        }

        System.out.println(Arrays.toString(outer.get(0)));
        System.out.println(Arrays.toString(outer.get(1)));
    }

}

我得到的输出是:

输出:

[13, 50, 3, 47, 53, 57, 61]
1
0
[13, 50, 3, 47, 53, 57, 61]
[66, 96, 45, 2, 95, 1, 69]
2
1
[66, 96, 45, 2, 95, 1, 69]
[66, 96, 45, 2, 95, 1, 69]
[66, 96, 45, 2, 95, 1, 69]

3 个答案:

答案 0 :(得分:4)

您正在将相同的int[]实例重复添加到列表中。

else {
    for(int j = 0; j < 7; j++)
    {
        int num = rand.nextInt(100);
        list[j] = num;
    }
    System.out.println(Arrays.toString(list));
    outer.add(list);
    System.out.println(outer.size());
    System.out.println(i);
    System.out.println(Arrays.toString(outer.get(i)));
}

此列表中的任何内容都不会调用list = new int[7]。这意味着每次操作,您都会用新的随机数覆盖list的内容,然后再次将相同的列表添加到ArrayList

ArrayList将使您高兴地一遍又一遍地添加相同的对象。重要的是要了解,将对象放入ArrayList不会以某种方式复制它或任何东西。

答案 1 :(得分:0)

每次将新的int []添加到ArrayList时,都需要每次创建一个新的数组。只需将int[] list = new int[7];移到for循环内,这样每次就可以创建一个新的int []。

答案 2 :(得分:0)

您更改了同一int[]实例的值,无论i是什么,并且您将int[]的相同引用引用到outer,所以outer.get(0)outer.get(0)将始终相同。