Java 如何在arraylist中保存元素的副本?
目前,我有一个Java 如何在arraylist中保存元素的副本?,java,arraylist,Java,Arraylist,目前,我有一个阵列列表,其中航路点是一个简单的类,用于表示x/y网格中的位置。现在我注意到,对于一种方法,我总是使用航路点对象的同一个实例,但我不断更改它的值 因此,如果我们说一个航路点WP,它被初始化为X=0,Y=0,我将其添加到阵列列表中,那么到底保存了什么?WP元素,还是只是保存其值的副本?或者,换一种说法,如果我现在增加WP的值并将其保存到ArrayList中ArrayList中位置0和1处的元素是否完全相同 如果是,是否有一种“简单”的方法来创建和保存航路点元素的副本,而无需每次创建一
阵列列表
,其中航路点
是一个简单的类,用于表示x/y网格中的位置。现在我注意到,对于一种方法,我总是使用航路点
对象的同一个实例,但我不断更改它的值
因此,如果我们说一个航路点WP
,它被初始化为X=0,Y=0
,我将其添加到阵列列表中,那么到底保存了什么?WP
元素,还是只是保存其值的副本?或者,换一种说法,如果我现在增加WP
的值并将其保存到ArrayList
中ArrayList
中位置0和1处的元素是否完全相同
如果是,是否有一种“简单”的方法来创建和保存航路点
元素的副本,而无需每次创建一个新的实例
提前谢谢 Java通过引用工作,因此航路点
对象如果没有显式克隆,将是相同的
如果保留对它的引用,则可以轻松更改其值,同时将这些值反映到列表中包含的同一对象中,因为它们都引用同一实例
这将显示您需要的行为:
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);
}
只需插入相同的元素两次,这不是您要寻找的。相反:
list.add(p);
Waypoint p2 = p.duplicate();
list.add(p2);
将插入两个不同的对象(假设replicate
实际使用new
实例化了一个不同的对象)Java通过引用工作,因此航路点
对象如果没有显式克隆,将是相同的
如果保留对它的引用,则可以轻松更改其值,同时将这些值反映到列表中包含的同一对象中,因为它们都引用同一实例
这将显示您需要的行为:
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);
}
只需插入相同的元素两次,这不是您要寻找的。相反:
list.add(p);
Waypoint p2 = p.duplicate();
list.add(p2);
将插入两个不同的对象(假设replicate
实际使用new
实例化了一个不同的对象)根据您共享的信息,答案是肯定的。将同一实例添加到数组中两次
复制对象的最简单方法是定义一个构造函数,该构造函数将原始对象作为参数,并复制必要的成员。根据您共享的信息,答案是肯定的。将同一实例添加到数组中两次
复制对象的最简单方法是定义一个构造函数,该构造函数将原始对象作为参数,并复制必要的成员。Java中没有隐式复制。所有对象都是通过引用操作的,对对象的任何更改都会影响持有引用的任何人
为了避免混淆谁持有什么价值观,制作大多数对象是一种很好的做法
至于你的问题,根据定义,“拷贝”是一个新实例,否则它就不是真正的拷贝。Java中没有隐式拷贝。所有对象都是通过引用操作的,对对象的任何更改都会影响持有引用的任何人
为了避免混淆谁持有什么价值观,制作大多数对象是一种很好的做法
至于您的问题,根据定义,“副本”是一个新实例,否则它就不是真正的副本。如果是,是否有一种“简单”的方法来创建副本并将其保存到航路点元素,而无需每次创建一个新实例?这不是自相矛盾的说法吗?是否要创建副本而不创建副本?或者您只是不愿意使用new
关键字?如果是,是否有一种“简单”的方法来创建和保存航路点元素的副本,而无需每次创建一个新实例?这不是自相矛盾的说法吗?是否要创建副本而不创建副本?或者您只是不愿意使用new
关键字?非常感谢!这对我帮助很大。非常感谢!这对我帮助很大。