Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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列表无法在不更改列表副本的情况下添加类然后更改原始类 我主要是用C++编程,java与C++非常类似。 我已经创建了一个列表命令 List<Item> stuff =new ArrayList<Item>(); List stuff=new ArrayList();_Java_Arraylist - Fatal编程技术网

java列表无法在不更改列表副本的情况下添加类然后更改原始类 我主要是用C++编程,java与C++非常类似。 我已经创建了一个列表命令 List<Item> stuff =new ArrayList<Item>(); List stuff=new ArrayList();

java列表无法在不更改列表副本的情况下添加类然后更改原始类 我主要是用C++编程,java与C++非常类似。 我已经创建了一个列表命令 List<Item> stuff =new ArrayList<Item>(); List stuff=new ArrayList();,java,arraylist,Java,Arraylist,其中Item是一个基本上存储数据的自定义类。 我从文本文件中获取信息并将其存储到项目中。 然后我使用stuff.add将item类设置为stuff。 之后,我使用一个命令删除item类中的所有数据,并查看它是否也删除了列表中的所有数据。 基本上,我想知道是否有办法添加类的副本,而不是类本身的地址 编辑: 因此,我发现重新初始化item类也解决了我的问题,但要感谢。您想在将项目添加到列表之前克隆该项目。该列表仅引用了您创建的原始项。因此,当您更改项目时,列表中的项目也会受到影响(它是同一个对象)

其中Item是一个基本上存储数据的自定义类。 我从文本文件中获取信息并将其存储到项目中。 然后我使用stuff.add将item类设置为stuff。 之后,我使用一个命令删除item类中的所有数据,并查看它是否也删除了列表中的所有数据。 基本上,我想知道是否有办法添加类的副本,而不是类本身的地址

编辑:
因此,我发现重新初始化item类也解决了我的问题,但要感谢。

您想在将项目添加到列表之前克隆该项目。该列表仅引用了您创建的原始项。因此,当您更改项目时,列表中的项目也会受到影响(它是同一个对象)

如果要“断开”放入列表中的项目,则可以先断开它。您的item类将需要实现并重写该方法。如果项目中只有原语,则只需执行以下操作:

public Object clone()
{
  return super.clone();
}
如果项中有其他对象,则默认克隆操作将只生成浅拷贝,并且需要使克隆方法更广泛,以便生成深拷贝。从Object.clone()的Javadoc:

按照约定,此方法返回的对象应该独立于此对象(正在克隆)。要实现这种独立性,可能需要在返回super.clone返回的对象之前修改该对象的一个或多个字段。通常,这意味着复制构成被克隆对象内部“深层结构”的任何可变对象,并将对这些对象的引用替换为对副本的引用。如果类仅包含基本字段或对不可变对象的引用,则通常情况下super.clone返回的对象中不需要修改任何字段


在爪哇中,对象引用就像C++中的指针一样。没有“复制构造函数”的概念。当您将某个项目添加到列表中,然后在将其添加到列表后更改该项目时,您已经注意到了这一点

通常在Java中,每次向列表中添加一个新的
项时,您都将使用
new
创建一个新的
项。比如:

while (...) {
    Item i = new Item(...);
    stuff.add(i);
}
而不是

Item i = new Item();
while (...) {
    i.foo = ...;
    stuff.add(i);
}

第二个例子将多次向列表中添加相同的对象。

可以帮助将每个java对象看作C++对象的指针。当然,有一个“复制构造函数”的概念,您只需显式地实现和调用它:<代码>项x =新项(y);<代码>其中
y