int []数组的Arraylist

问题描述 投票:0回答:3

我正在尝试一个简单的代码,我无法弄清楚出了什么问题。我试图将int []数组添加到ArrayList。它被正确添加。但是,一旦我在ArrayList中有超过1个元素,列表中的每个元素都将被最新值替换。我试图寻找可能的错误,但我找不到任何错误。我在这里给出了我的代码和输出,以便我可以帮助找出代码中的错误。

码:

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]
java arraylist
3个回答
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并不会以某种方式复制它或任何东西。


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.