这是今天练习的时候发现的问题,在for循环里使用list.add(list1)会覆盖之前的值,导致list里的值一模一样
public static void main(String[] args)
{
List <List<Integer>> list=new ArrayList<>();
List<Integer> list1=new ArrayList<>();
for(int i=0;i<3;i++)
{
list1.add(i);
list.add(list1);
System.out.print("list1"+list1);System.out.println();
System.out.print("list"+list);System.out.println();
}
}
list1[0]
list[[0]]
list1[0, 1]
list[[0, 1], [0, 1]]
list1[0, 1, 2]
list[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
所以我查阅资料发现,如果使用list时,泛型的类型是引用类型(如list.add(T))时,则list.add()添加的是地址而不是值,内存只会开辟一块固定空间,就会导致后面的值覆盖前面的值,若为值类型,则不会覆盖。
解决办法:使用list.add(new ArrayList<>(list1))
public static void main(String[] args)
{
List <List<Integer>> list=new ArrayList<>();
List<Integer> list1=new ArrayList<>();
for(int i=0;i<3;i++)
{
list1.add(i);
list.add(new ArrayList<>(list1));
System.out.print("list1"+list1);System.out.println();
System.out.print("list"+list);System.out.println();
}
}
list1[0]
list[[0]]
list1[0, 1]
list[[0], [0, 1]]
list1[0, 1, 2]
list[[0], [0, 1], [0, 1, 2]]