【发布时间】:2013-04-12 18:00:57
【问题描述】:
我已经阅读了很多关于 Java List、Map 等深度复制和序列化的内容,但我没有找到一些问题的好答案。我关心时间和性能,所以我正在寻找妥协。我在下面列出了我的问题,以便您可以解决您有答案的问题。
在性能方面,通过循环
list或使用序列化来进行深度复制,什么更好?我读过一篇文章(对不起,我失去了链接)说循环比 java 序列化好 4 倍。这是否意味着使用像 Kryo 这样的 3rd 方可以比循环更好?我不确定序列化在不同的3rd party libraries 中是如何工作的,但是如果我有许多子类级别会发生什么,序列化会比循环更好吗?
Java 中有没有复制原始内存的库?例如,在
C中使用类似memcopy()的函数的库。这会快得多,因为不需要关心类逻辑(当然它需要对非连续内存数据进行一些处理)。我知道 Java 是面向对象的 :),但这不会违反我认为的规则。如果我想在Java中实现
deepCopy(List<?>)和deepCopy(Map<?,?>),我可以把它们放在我拥有的MyTools类中吗?还是在 Java 中有一些更简洁的方法?
【问题讨论】:
-
好的不可变设计一开始很少需要深度复制。您需要深度复制的真正问题是什么?
-
基本上,我需要 Map 和 List 的深拷贝,而且我不喜欢每次深拷贝时都循环遍历数组(可以吗?)。由于 Map 和 List 使用泛型,我不知道如何为它们实现泛型方法。
-
你真的不能,是这样的。除非您使用序列化 hack,否则您无法进行通用深拷贝。
-
我会听听@LouisWasserman 的第一条评论。你不应该这样做。在将近 16 年的 Java 中,我从来没有需要深拷贝或 clone()。 (在经历了几次设计不佳的 C++ 库和代码生成器的糟糕经历后,我学会了不要这样做。)重新思考。
-
感谢 EJP,我所有的复制构造函数都实现得很深。但是我遇到了 List 和 Map 的问题。我怎样才能在不为所有泛型循环重复自己的情况下制作 List 或 Map 的副本?
标签: java performance serialization deep-copy