如何在元素列表中保存元素的副本?

时间:2012-02-20 04:51:18

标签: java arraylist

目前我有一个ArrayList<Waypoint>,其中Waypoint是一个简单的类,用于表示x / y网格中的位置。现在我注意到,对于一种方法,我总是使用Waypoint对象的相同instane - 但我一直在改变它的值。

因此,如果我们说Waypoint WP初始化为X = 0, Y = 0并将其添加到ArrayList,那究竟会保存什么? WP元素或仅包含其值的副本?或者,换句话说,如果我现在增加WP的值并将其保存到ArrayList,那么ArrayList中位置0和1处的元素是否完全相同?

如果是,是否有一种“简单”的方法来创建和保存Waypoint元素的副本而无需每次都创建新的instance

提前致谢!

2 个答案:

答案 0 :(得分:1)

Java通过引用工作,因此Waypoint对象(如果没有明确克隆)将是相同的。

如果你保留对它的引用,你可以很容易地改变它的值,同时将它们反映到列表中包含的同一个对象中,只是因为它们都引用了同一个实例。

这将显示您需要的行为:

static class Pair
{
    int x,y;

    public Pair(int x, int y) { this.x = x; this.y = y; }
}

public static void main(String[] args)
{
    java.util.ArrayList<Pair> pairs = new java.util.ArrayList<Pair>();
    Pair p = new Pair(0,0);
    pairs.add(p);
    p.x = 20; p.y = 40;
    System.out.println(pairs.get(0).x+" "+pairs.get(0).y);
}

您会看到输出为"20 40",正如您所期望的那样。

如果你想从你开始的那个生成一个新的航点,你应该定义自己的方法并明确地复制该对象。

否则

list.add(p);
// modify p
list.add(p);

只会插入相同的元素两次,这不是你想要的。代替:

 list.add(p);
 Waypoint p2 = p.duplicate();
 list.add(p2);

将插入两个不同的对象(假设duplicate实际使用new实例化另一个对象

答案 1 :(得分:0)

Java中没有隐式复制。所有对象都通过引用进行操作,对对象的任何更改都将影响持有引用的任何人。

为了避免混淆谁拥有什么价值观,最好是制作大多数对象immutable

至于你的问题,根据定义,“副本”是一个新实例,否则它不是真正的副本。