当前位置: 首页 > 面试题库 >

如何制作ArrayList的单独副本?

翟黎明
2023-03-14
问题内容

我有一个如下的示例程序:

ArrayList<Invoice> orginalInvoice = new ArrayList<Invoice>();

//add some items into it here

ArrayList<Invoice> copiedInvoice = new ArrayList<Invoice>();

copiedInvoice.addAll(orginalInvoice);

我以为我可以修改其中的项目,copiedInvoice而不会影响其中的这些项目originalInoice。但是我错了。

如何制作的单独副本/克隆ArrayList

谢谢


问题答案:

是的,这是正确的-
您需要实现clone()(或另一种合适的机制来复制对象,这clone()被许多程序员认为“破坏了”)。您的clone()方法应该对对象内所有可变字段进行深层复制。这样,对克隆对象的修改将不会影响原始对象。

在示例代码中,您正在创建第二个代码,ArrayList并使用 对相同对象的引用
填充它,这就是为什么从两个对象都可以看到对对象的更改的原因List。使用克隆方法,您的代码将如下所示:

List<Foo> originalList = ...;

// Create new List with same capacity as original (for efficiency).
List<Foo> copy = new ArrayList<Foo>(originalList.size());

for (Foo foo: originalList) {
  copy.add((Foo)foo.clone());
}

编辑 :为澄清起见,以上代码正在执行原始对象的 深层副本
List其中新代码List包含对原始对象副本的引用。这与调用相比ArrayList.clone(),后者执行shallow copyList。在这种情况下,浅表副本会创建一个新List实例,但其中包含对原始对象的引用。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 9年前关闭。 可能重复: 如何克隆ArrayList并克隆其内容? 试图复制一个ArrayList。基础对象很简单,包含Strings,ints,BigDecimals,Dates和DateTime对象。如何确保对新ArrayList所做的修改不会反映在旧ArrayList中? 干杯,P 问题答案: 在添加对象之前先对其进行克隆。例如,代替 假设已正确覆

  • 问题内容: 我研究过Java是按值传递对象引用,并且为了创建对象的本地副本,我可以执行clone()或copy-constructor。我还查看了深/浅副本以及关于stackoverflow的几篇文章。 现在我看一个例子: 我只读过几篇文章提到ArrayList实现可克隆,但是并没有真正说出如果类型为List而不是不实现可克隆的ArrayList,那么如何制作“列表”的本地副本。 如果“列表”是A

  • 问题内容: 我如何才能向中添加一堆类,然后再从中检索一个类(派生自,但不是),并使用它来生成实际检索到的类的新对象(即,因为那不是抽象的) 所有需要添加的类都源自同一个 抽象 基类() 我真的想不出另一种方法来实现自己的目标,所以希望这是可能的…? 问题答案: 为了防止使用反射,您可能正在寻找抽象工厂模式。这是一个简单的示例,说明如何使用Java 8实现它:

  • 问题内容: 我正在学习如何使用LibGDX制作游戏,并且正在尝试制作一个小型平台游戏(使用Eclipse)。我在主角跑动时制作了4张图像,以便在他移动时制作动画。但是,我在网上找不到任何东西可以向我展示如何在不使用SpriteSheet的情况下制作动画。如何使用4张不同的图像制作动画? 问题答案: 首先:您不应使用其他图像。也许对您的播放器来说并不重要(因为只有一个),但是通常您应该始终使用Spr

  • 您好,我正在尝试制作一个数组,其结尾如下: 但最后却是这样说的 这是图像:数组 我仍然不明白Java,但我需要完成它作为家庭作业。

  • 问题内容: 在我的应用中,我想用其他名称保存某个文件的副本(我从用户那里得到) 我真的需要打开文件的内容并将其写入另一个文件吗? 最好的方法是什么? 问题答案: 要复制文件并将其保存到目标路径,可以使用以下方法。 在API 19+上,你可以使用Java自动资源管理: