繁体   English   中英

为什么修改 ArrayList 中一个元素的值会改变另一个元素的值?

[英]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]]

1

point.add(point.get(point.size()-1));

不会做你认为的那样。 它将对数组列表中倒数第二个元素的reference添加到最后一个。 因此,当您尝试显示最后一个元素的值时,它实际上是从point倒数第二个values中获取数据并显示它。 要单独修改数据,请将我指出的行替换为:

point.add(new ArrayList<Integer>(values));

所以你应该在point的末尾分别添加两个values副本。

2

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM