[英]Why does mutating an object in one ArrayList change it in all other ArrayLists?
[英]Why does modifying the value of an element in an ArrayList change that of the other?
我想获取名为 point 的 2D arrayList 的 lastElement 并将最后一个元素添加回列表作为具有更新的 Y 值和相同 X 值的新元素。 所以基本上我所做的是获取点二维数组的最后一个元素,将其添加到点二维数组的末尾,但更改为 y 值。 但问题是,当我更改 y 值时,它也会更改从中获取信息的元素的值。
List<List<Integer>> point = new ArrayList<List<Integer>>();
List<Integer> values= new ArrayList<Integer>();
values.add(1);//x
values.add(2);//y
point.add(values);
point.add(point.get(point.size()-1));
point.get(0).set(1, 200);
System.out.println(point);
输出:[[1, 200], [1, 200]] 预期输出:[[1, 2], [1, 200]]
point.add(point.get(point.size()-1));
不会做你认为的那样。 它将对数组列表中倒数第二个元素的reference
添加到最后一个。 因此,当您尝试显示最后一个元素的值时,它实际上是从point
倒数第二个values
中获取数据并显示它。 要单独修改数据,请将我指出的行替换为:
point.add(new ArrayList<Integer>(values));
所以你应该在point
的末尾分别添加两个values
副本。
point.get(0).set(1, 200); //0 denotes first element. not last
会给你这个输出:
[[1, 200], [1, 2]]
这应该替换为
point.get(point.size() - 1).set(1, 200); //last element
纠正这两个错误将为您提供预期的输出。
试试这个
List<List<Integer>> point = new ArrayList<List<Integer>>();
List<Integer> values = new ArrayList<Integer>();
values.add(1);// x
values.add(2);// y
point.add(values);
List<Integer> secondList = new ArrayList<Integer>(point.get(point
.size() - 1));
secondList.set(1, 200);
point.add(secondList);
System.out.println(point);
List<List<Integer>> point = new ArrayList<List<Integer>>();
List<Integer> values= new ArrayList<Integer>();
values.add(1);//x
values.add(2);//y
point.add(values);
List<Integer> values2= new ArrayList<Integer>();
values2.add(point.get(point.size()-1).get(0));
values2.add(point.get(point.size()-1).get(1));
point.add(values2);
point.get(1).set(1, 200);
System.out.println(point);
这将工作得很好。 由于添加到 point 的新元素与初始元素的引用相同,因此出现问题。 因此所做的更改将应用于这两个元素。
当您添加第二个条目以指向时
point.add(point.get(point.size()-1));
您实际上将引用添加到第一个数组。 因此,它们自然是相同的,并且也会相应地改变。
您需要创建一个新对象作为副本才能使其唯一,例如
point.add(new ArrayList<Integer>(point.get(point.size()-1)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.