数组的克隆方法是深拷贝还是浅拷贝?

5
我不确定以下内容会产生深复制还是浅复制?
public void viewImages(final String[] instancesFilename) {

    String[] instances = (String[])instancesFilename.clone();    
}

有没有一种简单快捷的方法来深度复制一个字符串数组?
3个回答

14

Java中的字符串是不可变的(无法更改它们的值)。因此,在复制字符串时,深拷贝和浅拷贝之间没有明显的区别。

还有一点需要注意:复制会是浅层的,但这应该不是问题,因为字符串是不可变的。

还有一个有趣的事实:字符串无法使用克隆方法进行克隆,因此如果你尝试使用克隆方法对字符串进行深度复制,你将会得到一个CloneNotSupportedException(克隆不支持异常)。


1
作者要求复制String[]而不是StringinstancesFilename的元素可能稍后从外部更改,因此该帖子希望创建数组的副本。 - Philipp Reichart
好的,它是可以被检测出来的(引用是否相同),但如果你正确使用字符串,它不应该有太大影响。 - Jon Skeet
@PhilippReichart:但是OP已经执行了克隆 - 在这种情况下,“深拷贝”与“浅拷贝”只能涉及字符串是否被克隆 - 正如这个答案所述,这几乎总是不重要的。 - Jon Skeet
但是字符串可以使用"intern()"方法,这会产生一种浅拷贝的效果:\ - Miguel Ping
只是想确保我不以任何方式引用作为参数传递的数组。我可以创建一个新数组并使用for循环进行复制。但我认为这将导致更慢和相同的行为。 - code-gijoe
1
你的克隆方法将创建一个新的独立数组,并使用对同一字符串对象的新引用。这很可能是你想要/需要的。但是,你的新引用将指向与原始数组相同的字符串对象。但我无法想象为什么这会成为一个问题。 - MTilsted

2

1

这里有一篇有趣的文章,讨论使用序列化来进行深拷贝

调用图中的对象确实需要支持序列化,但在许多业务类型的三层应用程序中,这种必要性是存在的。

该文章提供了深拷贝和浅拷贝的讨论,并附有一些图表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接