2012-02-20 97 views
1

目前我有一个ArrayList<Waypoint>其中Waypoint是一个简单的类,用于表示一个x/y网格中的位置。现在我注意到,对于一种方法,我总是使用与Waypoint对象相同的实例 - 但我不断改变它的值。如何在一个数组列表中保存一个元素的副本?

所以,如果我们说Waypoint WP这是初始化为X = 0, Y = 0,我将它添加到ArrayList,究竟保存了什么? WP元素还是只保存其值的副本?或者,换言之,如果我现在将WP的值递增并将其保存到ArrayList那么位置0处的元素和ArrayList10中的元素是否完全相同?

如果是,是否有“简单”的方式来创建并保存副本Waypoint元素,而不必每次创建新的instance

在此先感谢!

+0

你能显示你的代码吗? – 2012-02-20 04:52:39

+0

*如果是的话,是否有一种“简单”的方式来创建和保存副本Waypoint元素,而不必每次都创建一个新的实例?*这不是一个自相矛盾的陈述吗?你想创建一个副本而不创建副本?或者你是否不愿意使用'new'关键字? – 2012-02-20 04:57:22

回答

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

+0

非常感谢!这对我有很大的帮助。 – Haris 2012-02-20 05:06:57

0

您共享的信息,答案是肯定的。您将同一个实例添加到数组两次。

复制对象最简单的方法是定义一个构造函数,它将原始参数作为参数并复制必要的成员。

0

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

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

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

相关问题