我需要将大约 420,000 个元素轻松存储在某种集合或列表中。但限制是我需要能够选择一个随机元素并且它需要很快。
最初我使用了一个 ArrayList 和一个 LinkedList,但是有那么多元素,速度非常慢。当我分析它时,我看到我存储的对象中的 equals()
方法在很短的时间内被调用了大约 2100 万次。
接下来我尝试了一个 HashSet。我在性能上获得了什么,却在功能上失去了:我不能选择一个随机元素。 HashSet 由 HashMap 支持,而 HashMap 由一组 HashMap.Entry
对象支持。然而,当我试图公开它们时,我被整个 Java 集合框架疯狂的私有(private)和包私有(private)可见性所阻碍(即使复制和粘贴类也不起作用,JCF 非常“使用我们拥有的或推出你自己的”)。
随机选择存储在 HashSet 或 HashMap 中的元素的最佳方法是什么?由于集合的大小,我不想使用循环。
重要编辑:我忘记了一个非常重要的细节:我是如何使用这个集合的。我在表格的开头填充了整个集合。在程序中,我选择并删除一个随机元素,然后选择并删除一些已知元素,然后重复。不断的查找和更改是导致缓慢的原因
最佳答案
ArrayList
或 LinkedList
没有理由需要调用 equals()
... 尽管您不t 需要一个 LinkedList
,因为您希望通过索引快速随机访问。
一个 ArrayList
应该是理想的 - 用适当的容量创建它,将所有项目添加到它,然后你可以在适当的范围内重复选择一个随机数,然后调用 get(index)
获取相关值。
HashMap
和 HashSet
根本不适合这个。
关于java - 在不循环的情况下随机获取 HashMap 或 HashSet 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7959988/