我有大约420,000个元素需要轻松地存储在Set或List中。但限制条件是我需要能够快速地随机选择一个元素。
最初,我使用了ArrayList和LinkedList,但是由于元素太多,速度非常慢。当我对其进行剖析时,我发现我存储的对象的equals()方法在很短的时间内被调用了大约2100万次。
接下来,我尝试了HashSet。虽然性能得到了提高,但我失去了功能:我无法随机选择一个元素。HashSet由HashMap支持,后者又由HashMap.Entry对象的数组支持。但是当我试图暴露它们时,我受到了整个Java Collections Framework疯狂的私有和包可见性的阻碍(即使复制和粘贴该类也不起作用,JCF非常“使用我们拥有的或自己开发”)。
在HashSet或HashMap中随机选择一个元素的最佳方法是什么?由于集合的大小,我希望不使用循环。
重要编辑:我忘记了一个非常重要的细节:我如何使用集合。我在表格开始时填充整个集合。在程序执行期间,我随机选择一个元素并将其删除,然后选择并删除几个已知的元素,然后重复此过程。这种不断查找和更改是导致速度缓慢的原因。
最初,我使用了ArrayList和LinkedList,但是由于元素太多,速度非常慢。当我对其进行剖析时,我发现我存储的对象的equals()方法在很短的时间内被调用了大约2100万次。
接下来,我尝试了HashSet。虽然性能得到了提高,但我失去了功能:我无法随机选择一个元素。HashSet由HashMap支持,后者又由HashMap.Entry对象的数组支持。但是当我试图暴露它们时,我受到了整个Java Collections Framework疯狂的私有和包可见性的阻碍(即使复制和粘贴该类也不起作用,JCF非常“使用我们拥有的或自己开发”)。
在HashSet或HashMap中随机选择一个元素的最佳方法是什么?由于集合的大小,我希望不使用循环。
重要编辑:我忘记了一个非常重要的细节:我如何使用集合。我在表格开始时填充整个集合。在程序执行期间,我随机选择一个元素并将其删除,然后选择并删除几个已知的元素,然后重复此过程。这种不断查找和更改是导致速度缓慢的原因。
equals()
方法什么时候被调用了?你通常对这个集合执行哪些操作? - Bozhoequals()
方法吗?是唯一性吗,在添加之前先调用contains()
方法? - Mark Peters