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