繁体   English   中英

Java列表/设置性能

[英]Java List/Set performance

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

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

获取和遍历Collection是最重复的方案,因此在此方案中必须具有良好的性能。

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

提前致谢

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

使用TreeSet插入已排序的项目(例如从磁盘重新读取集合)会产生不好的效果,因为即使是平衡的树,其深度也会过大。 但是,可以补救。

为了获得更好的性能,您可能需要使用B树 (需要第3方代码)而不是二进制TreeSet。 也要进行测量,因为通常情况下,诸如带有重新平衡的删除之类的方面可能不太理想。

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

您是否立即用物品填充收藏? 还是不时添加新元素? 添加元素的性能重要吗? 还是仅迭代性能很重要?

如果性能至关重要,则可以实施一些解决方案并使用基准比较它们的性能。

我个人不认为TreeSet迭代性能比ArrayListLinkedListLinkedHashMap差得多。 特别是与链接的数据结构相比。 树的迭代在性能上应该没有太大的不同。 但是我没有数据,所以这只是一种信念。

以下是两个实施思路。

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

接下来,如果在数据集“开始处”填充数据集,然后几乎不修改该数据集,则可以简单地将迭代顺序缓存在ArrayList 每次修改集合时,都要重置此列表。 当请求迭代并且列表不为null ,请使用它,否则首先按已排序集合的顺序填充它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM