散列集实现或技术有效的浅层克隆?

时间:2012-01-05 13:01:12

标签: java data-structures

我算法的一个关键部分是克隆Set个对象。我尝试了几种优化此操作的方法,包括:

  • 重用这些元素,这样我只需要浅层复制 - 大大提高性能。
  • 依靠集合的clone方法,而不是手动插入对象 - 获得较小的性能提升(可能原因见下文)。
  • 使包含该集合的类保持写入时复制标志,以便克隆这些对象是O(1),并且只有在插入/删除时才克隆这些集合 - 一些性能提升。
  • 最后我还想过我是否可以放弃这种方法,但这是另一个问题的主题:)

然而,分析显示克隆操作仍然需要很长时间。我可以忍受它,但我一直想知道是否有任何技巧可以让我进一步优化这个操作 - 例如,我听说过通过序列化克隆的技巧,虽然我不确定会不会帮助

我也愿意切换到Java的Set接口的不同实现,只要它依赖于hashCodeequals。我的集合通常不是很大,高达几十个项目,所以我也愿意牺牲传统集合运算符(addcontains)的一些效率,如果它可以帮助的话。我甚至考虑过转移到由LinkedList或一些跳过列表支持的自定义实现,但在此之前我想问一下是否有人对此有任何经验或见解。

编辑:对于那些要求为什么我需要多次克隆这些集合的人 - 这是一个很好的问题!现在算法依赖于初始化一组集合与另一组集合相同,后来这两个组可以独立更新,这就是为什么克隆对我来说似乎是一个明显的解决方案 - 但是肯定存在一个更好的解决方案。正如我在上面的第4个子弹中写的那样,我可能确实选择了不同的解决方案,但同时我想将这个问题集中在优化现有的上。

1 个答案:

答案 0 :(得分:0)

序列化比深度克隆慢得多。我怀疑它会有所帮助。

最高性能的解决方案是避免首先需要克隆,然后根本不需要任何时间。也许有关于您使用克隆的原因的详细信息,我们可以提出另一种选择。

加速克隆的一种方法是使用一个引用不可变集的Set,并记住Map<E, Boolean>中的差异,其中值为true或false,具体取决于是否已添加或删除。如果变化的数量相对较少,这将最有效。