我正在填充 ArrayList<Integer> 类型的 ArrayList。插入完成两次,但结果仅反映第二次更新。解释
I'm filling up an ArrayList of ArrayList<Integer> type . The insertion is done twice but the result reflects only the second update. Explain
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> l = new ArrayList<>();
l.add(1);
l.add(4);
list.add(i,l);
i++;
l.clear();
l.add(0);
l.add(4);
l.add(3);
l.add(2);
list.add(i,l);
现在我的列表有 2 个具有相同值 {0,4,3,2} 的元素。 {1,4} 会怎样?
这是正在发生的事情。 list
包含对 l
的引用。因此,当您清除 l
时,您会清除添加到 list
的那个。但是引用仍然存在以接受新值。
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> l = new ArrayList<>();
l.add(1);
l.add(4);
list.add(i,l);
i++;
l.clear(); // you just deleted all the contents of list `l` but not the list `l` itself.
l.add(0);
l.add(4);
l.add(3);
l.add(2); // now list `l` (the reference still in `list` contains 0,4,3,2
list.add(i,l); // and now list contains the same reference yet again so you get
System.out.println(list);
打印
[[0, 4, 3, 2], [0, 4, 3, 2]]
请注意,如果您这样做,list.get(0).set(1,99)
将影响两个列表,因为列表 list
中的每个列表 l
都是对同一列表的引用。
[[0, 99, 3, 2], [0, 99, 3, 2]]
WJS的回答是正确的
如果您想知道如何让它按照您期望的方式工作:
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> l = new ArrayList<>();
l.add(1);
l.add(4);
list.add(i,l);
i++;
l = new ArrayList<>(); //Remove l.clear(); and add new instance of the ArrayList
l.add(0);
l.add(4);
l.add(3);
l.add(2);
list.add(i,l);
不要混淆,最好使用新名称进行新声明,例如:
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> listFirst = new ArrayList<>();
listFirst.add(1);
listFirst.add(4);
list.add(i,listFirst);
i++;
ArrayList<Integer> listSecond = new ArrayList<>();
listSecond.add(0);
listSecond.add(4);
listSecond.add(3);
listSecond.add(2);
list.add(i,listSecond);
System.out.println(list);
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> l = new ArrayList<>();
l.add(1);
l.add(4);
list.add(i,l);
i++;
l.clear();
l.add(0);
l.add(4);
l.add(3);
l.add(2);
list.add(i,l);
现在我的列表有 2 个具有相同值 {0,4,3,2} 的元素。 {1,4} 会怎样?
这是正在发生的事情。 list
包含对 l
的引用。因此,当您清除 l
时,您会清除添加到 list
的那个。但是引用仍然存在以接受新值。
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> l = new ArrayList<>();
l.add(1);
l.add(4);
list.add(i,l);
i++;
l.clear(); // you just deleted all the contents of list `l` but not the list `l` itself.
l.add(0);
l.add(4);
l.add(3);
l.add(2); // now list `l` (the reference still in `list` contains 0,4,3,2
list.add(i,l); // and now list contains the same reference yet again so you get
System.out.println(list);
打印
[[0, 4, 3, 2], [0, 4, 3, 2]]
请注意,如果您这样做,list.get(0).set(1,99)
将影响两个列表,因为列表 list
中的每个列表 l
都是对同一列表的引用。
[[0, 99, 3, 2], [0, 99, 3, 2]]
WJS的回答是正确的
如果您想知道如何让它按照您期望的方式工作:
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> l = new ArrayList<>();
l.add(1);
l.add(4);
list.add(i,l);
i++;
l = new ArrayList<>(); //Remove l.clear(); and add new instance of the ArrayList
l.add(0);
l.add(4);
l.add(3);
l.add(2);
list.add(i,l);
不要混淆,最好使用新名称进行新声明,例如:
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int i=0;
ArrayList<Integer> listFirst = new ArrayList<>();
listFirst.add(1);
listFirst.add(4);
list.add(i,listFirst);
i++;
ArrayList<Integer> listSecond = new ArrayList<>();
listSecond.add(0);
listSecond.add(4);
listSecond.add(3);
listSecond.add(2);
list.add(i,listSecond);
System.out.println(list);