Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在arraylist中保存元素的副本?_Java_Arraylist - Fatal编程技术网

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
关键字?非常感谢!这对我帮助很大。非常感谢!这对我帮助很大。