【问题标题】:About Deep Copy and Serialization关于深度复制和序列化
【发布时间】:2013-04-12 18:00:57
【问题描述】:

我已经阅读了很多关于 Java ListMap 等深度复制和序列化的内容,但我没有找到一些问题的好答案。我关心时间和性能,所以我正在寻找妥协。我在下面列出了我的问题,以便您可以解决您有答案的问题。

  1. 在性能方面,通过循环 list 或使用序列化来进行深度复制,什么更好?我读过一篇文章(对不起,我失去了链接)说循环比 java 序列化好 4 倍。这是否意味着使用像 Kryo 这样的 3rd 方可以比循环更好?

  2. 我不确定序列化在不同的3rd party libraries 中是如何工作的,但是如果我有许多子类级别会发生什么,序列化会比循环更好吗?

  3. Java 中有没有复制原始内存的库?例如,在C 中使用类似memcopy() 的函数的库。这会快得多,因为不需要关心类逻辑(当然它需要对非连续内存数据进行一些处理)。我知道 Java 是面向对象的 :),但这不会违反我认为的规则。

  4. 如果我想在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


【解决方案1】:
  1. 循环总是比序列化快,除非您只是序列化基元。
  2. 在第三方库中,它们通常处理子类和各种类型。他们通过使用 sun.misc.Unsafe.class 来做到这一点
  3. 是的,实际上您可以使用 Unsafe 类复制内存。检查 Unsafe 类的实现。
  4. 您可以使用 MyTools 或假设 Utils 类为您做这些。

根据您的需要,列表、地图和其他泛型没有深度复制的方法。因此,您最终可能会使用像 Kryo 这样好的序列化库。

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多