目前我有一个ArrayList<Waypoint>
,其中Waypoint
是一个简单的类,用于表示x / y网格中的位置。现在我注意到,对于一种方法,我总是使用Waypoint
对象的相同instane - 但我一直在改变它的值。
因此,如果我们说Waypoint WP
初始化为X = 0, Y = 0
并将其添加到ArrayList
,那究竟会保存什么? WP
元素或仅包含其值的副本?或者,换句话说,如果我现在增加WP
的值并将其保存到ArrayList
,那么ArrayList
中位置0和1处的元素是否完全相同?
如果是,是否有一种“简单”的方法来创建和保存Waypoint
元素的副本而无需每次都创建新的instance
?
提前致谢!
答案 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。
至于你的问题,根据定义,“副本”是一个新实例,否则它不是真正的副本。