Java:在地图和圆中搜索的速度

Java:在地图和圆中搜索的速度,java,map,Java,Map,我有一个模块列表,它有两个字段:时间和大小,我需要根据给定的时间/大小找到一个模块 我有两个解决方案: for(模块:myModuleList) 我创建一个映射并使用Map.get() 我想知道哪一个会更快或消耗更少的资源?因为这种操作会随着越来越大的模块列表而定期出现。迭代列表是O(myModuleList.size()),而使用Map.get()是O(1)对于HashMap或O(log(myModuleList.size())对于TreeMap。因此,如果您正在优化性能,那么使用HashMa

我有一个模块列表,它有两个字段:时间和大小,我需要根据给定的时间/大小找到一个模块

我有两个解决方案:

  • for(模块:myModuleList)
  • 我创建一个映射并使用Map.get()
    我想知道哪一个会更快或消耗更少的资源?因为这种操作会随着越来越大的模块列表而定期出现。

    迭代列表是
    O(myModuleList.size())
    ,而使用
    Map.get()
    O(1)
    对于
    HashMap
    O(log(myModuleList.size())
    对于
    TreeMap
    。因此,如果您正在优化性能,那么使用
    HashMap
    将是最好的解决方案。在几乎所有情况下,默认情况下都应该使用
    HashMap
    ,除非还需要按键顺序迭代元素,在这种情况下,使用
    TreeMap
    是有意义的。因此,简单的回答是您应该使用HashMap


    对于大量元素(您描述的不是这种情况),可以通过调整负载因子和初始容量(尽管在普通使用中不需要这样做),来提高HashMap的空间使用率(尽管以牺牲速度为代价)。根据您的需要,还有一些可选的映射数据结构可以在性能和空间上进行不同的权衡。

    迭代将是O(n);HashMap get()是O(1)。选择HashMap。您还可以实现equals和hashCode,并使用indexOf搜索模块。@duffymo-创建HashMap所花费的时间如何?。我同意这将是一次性的,顺便说一句,所以所有未来的阅读都是
    O(1)
    这一切都不太可能重要。这充其量只是一个微观优化。如果大小成为一个很大的问题,我建议将其放入数据库中。在任何情况下,最好的做法是配置文件,获取一些真实的数据,并仅在出现问题时进行修复。您的模块lis的动态是什么?也就是说,它是如何被填充的?它是否开始为空,并在程序运行时填充?您是否总是在每次搜索之前建立完整的列表?它有多大?是否也只有添加或删除?需要一些上下文来给出有用的答案。我看不出树形映射如何比哈希映射更节省内存。@duffymo,哈希映射是一个开放寻址实现。为了保持性能,与树实现相比,map保持了大量的过剩容量。树映射需要4n空间(键、值、左、右),而哈希映射需要可变的空间量,具体取决于加载因子。对于Java,它默认为0.75,这意味着当它饱和到容量时,需要4N,其中N=2n(键,值)。当空间不饱和时,空间就更不经济了。是的,它们都是O(n),但前导序系数在实践中是重要的。在100个元素的实践中?让我们看看这方面的一些数据,仍然是400对800个指针(3.2kb对6.4kb假设为64位指针)。OP也没有指定大小。在RAM高度可用的服务器或桌面上,HashMap是更好的默认选择,这是对的,但在内存有限的手机上,例如,3.2kb的差异可能会很重要。请。3.2kb?不是现在;甚至在我5岁的手机上都没有。OP确实指定了100个左右的条目。在数据表明这一点之前并不重要。你现在更担心你的自我,而不是一个好的答案。