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

时间:2016-09-21 10:51:11

标签: java arraylist

我想得到名为point的2D arrayList的lastElement,并将最后一个元素作为具有更新Y值和相同X值的新元素添加回列表。所以基本上我正在做的是获得点2D数组的最后一个元素,在点2D数组的末尾添加它,但是将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]]

4 个答案:

答案 0 :(得分:0)

1

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

没有做你的想法。它将reference添加到a​​rraylist中的倒数第二个元素到最后一个元素。因此,当您尝试显示最后一个元素的值时,它实际上从values中的倒数第二个point获取数据并显示该数据。要单独修改数据,请将我指出的行替换为:

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

因此,您应该在values的末尾单独添加两份point

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

纠正这两个错误将为您提供预期的输出。

答案 1 :(得分:0)

试试这个

    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);

答案 2 :(得分:0)

    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);

这样可以正常工作。 由于添加到点的新元素具有与初始元素相同的引用,因此发生了问题。因此,所做的更改将应用​​于这两个元素。

答案 3 :(得分:-1)

当您使用

添加第二个条目时
point.add(point.get(point.size()-1));

您实际上是将引用添加到第一个数组。因此,它们将是相同的,并且也相应地改变是很自然的。

您需要创建对象作为其唯一的副本,例如

point.add(new ArrayList<Integer>(point.get(point.size()-1)));