【问题标题】:Java List/Set performanceJava List/Set 性能
【发布时间】:2018-02-19 07:37:24
【问题描述】:

我必须使用Collection,我不确定使用ListSet。此集合必须排序,但不是按插入顺序而是按另一个,因此每次添加新项目时,都应执行Comparator 以重新排序Collection。因此,出于这个原因,ArrayList 可能是最佳选择。

Collection 中删除对象也必须是可能的,此外,我非常感谢使用removeIf 方法,因此Set 将是这里的最佳选择。

获取和迭代Collection会是重复次数最多的场景,所以在这种场景下一定有不错的表现。

看到这一点,我认为Set 将是一个不错的决定,但是,我正在考虑在添加项目时将Set 转换为List,然后,一旦使用了列表,就将其转换回到Set。是不是表现不好?你怎么看?

提前致谢

【问题讨论】:

  • 您希望您的Collection 能够包含重复元素吗?
  • 因此,每次添加新项目时,都应执行 Comparable 以对 Collection 重新排序。因此,出于这个原因,ArrayList 可能是最佳选择 - 不。实际上,ArrayList 是按插入顺序排序的,这是您不想要的。 Set 会在您每次广告元素时进行排序,因此这将是这里的最佳选择。
  • 你能详细说明你想用这个列表实现什么吗?那么我们或许可以为您提供更好的建议
  • 你觉得 TreeSet 怎么样?
  • 你看过TreeSet吗?为什么需要Set 才能使用removeIf?这是所有Collections 的默认方法。在 list 和 set 之间转换肯定没有帮助,因为你会失去顺序(当然,除非你转换为 TreeSet,但无论如何你不需要列表)。

标签: java performance list collections set


【解决方案1】:

除非您有不需要排序的批量插入,否则 TreeSet 很好。只需测量两个解决方案。

使用 TreeSet 插入已排序的项目,例如从磁盘重新读取集合,表现不佳,因为即使是平衡树,深度也会有点过大。然而,这是可以补救的。

为了获得更好的性能,您可能会选择 B-tree(需要 3rd 方代码)而不是二进制 TreeSet。 也要衡量这一点,因为通常情况下,如删除再平衡等方面可能做得不够理想。

【讨论】:

    【解决方案2】:

    这在很大程度上取决于您如何填充和使用您的集合以及执行哪种操作最重要。

    您是否一次用项目填充集合?还是不时添加新元素?添加元素的性能重要吗?还是只有迭代性能很重要?

    如果性能至关重要,那么实施一些解决方案并使用benchmark 比较它们的性能可能是有意义的。

    我个人不认为TreeSet 的迭代性能比ArrayLists 或LinkedLists 或LinkedHashMaps 差那么多。特别是与链接数据结构相比。树上的迭代在性能上应该没有那么不同。但是我没有数据,所以这里只是一个信念。

    以下是两个实现思路。

    首先,如果您一次加载大量数据,然后很少添加新项目,请将数据加载到ArrayList 并使用Collections.sort 对其进行排序。如果您需要添加另一个项目,请执行二分搜索 (Collections.binarySearch) 并在相应位置插入元素。将其全部封装在自定义的 List 实现中,一切顺利。

    接下来,如果你用“一开始”的数据填充集合,然后集合几乎没有被修改,你可以简单地将迭代顺序缓存在ArrayList 中。每次修改集合时,重置此列表和。当请求迭代且列表不是null时,直接使用即可,否则先按排序集的顺序填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 2017-10-19
      • 2011-12-08
      • 1970-01-01
      • 2022-01-05
      • 2011-03-17
      • 2018-11-21
      相关资源
      最近更新 更多