java - 在不循环的情况下随机获取 HashMap 或 HashSet 中的元素

标签 java collections hashmap hashset

我需要将大约 420,000 个元素轻松存储在某种集合或列表中。但限制是我需要能够选择一个随机元素并且它需要很快。

最初我使用了一个 ArrayList 和一个 LinkedList,但是有那么多元素,速度非常慢。当我分析它时,我看到我存储的对象中的 equals() 方法在很短的时间内被调用了大约 2100 万次。

接下来我尝试了一个 HashSet。我在性能上获得了什么,却在功能上失去了:我不能选择一个随机元素。 HashSet 由 HashMap 支持,而 HashMap 由一组 HashMap.Entry 对象支持。然而,当我试图公开它们时,我被整个 Java 集合框架疯狂的私有(private)和包私有(private)可见性所阻碍(即使复制和粘贴类也不起作用,JCF 非常“使用我们拥有的或推出你自己的”)。

随机选择存储在 HashSet 或 HashMap 中的元素的最佳方法是什么?由于集合的大小,我不想使用循环。

重要编辑:我忘记了一个非常重要的细节:我是如何使用这个集合的。我在表格的开头填充了整个集合。在程序中,我选择并删除一个随机元素,然后选择并删除一些已知元素,然后重复。不断的查找和更改是导致缓慢的原因

最佳答案

ArrayListLinkedList 没有理由需要调用 equals()... 尽管您不t 需要一个 LinkedList ,因为您希望通过索引快速随机访问。

一个 ArrayList 应该是理想的 - 用适当的容量创建它,将所有项目添加到它,然后你可以在适当的范围内重复选择一个随机数,然后调用 get(index) 获取相关值。

HashMapHashSet 根本不适合这个。

关于java - 在不循环的情况下随机获取 HashMap 或 HashSet 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7959988/

相关文章:

java - ServiceTracker 与 BundleTracker

java - 我可以使用 .xml < context-param > 作为 .as 类中的常量吗?

java - 如何检查 ArrayDeque 的索引是否为空?

java - BigDecimal 的总和列表

grails - 如何在 Grails 中搜索其集合中包含另一个元素的元素?

java - 字符串 HashMap 中的字节数组

Java:比较对象值

Java 数据层次结构和行映射

java - 我的 HashMap<String, ArrayList> 的键获取了错误的值

java将HashMap元素放入foreach循环中仅使用最后一个