如何使用最少的资源循环地图?

时间:2011-09-29 11:00:49

标签: java map

我一直在寻找一种最好的方法来循环一个涉及尽可能少资源的地图。假设我有一个对象作为值,键是一个引用该对象的字符串。通过以下两个循环,我可以知道哪一个更好,你是如何证明它只运行最少的资源?

for(Map.Entry<String, MyObject> entry : myMap.entrySet()) {
  ...
}

for( String key : myMap.keySet() ) {
  ...
}

谢谢@!

5 个答案:

答案 0 :(得分:5)

这取决于您使用的具体Map。由于Map是一个界面,因此无法分辨它是什么。

在大多数地图实施中,entrySetkeySet都会返回基础条目/键集的视图,所以我会说它们可能更多或者在所有方面都不那么有效。

请注意,如果您检索所有条目,则表示您同时获取了这些值。如果您经常需要值,这可能会节省您一些时间。

答案 1 :(得分:4)

我相信以下内容更有效:

for(Map.Entry<String, MyObject> entry : myMap.entrySet()) {
  ...
}

这是因为它可能根据Map实现对集合进行简单的迭代。另一方面,如果您遍历键,然后使用键调用Map的 get 方法,则不仅要迭代一组键,还要执行查找以从中检索每个元素。地图。

答案 2 :(得分:2)

对于通常/合理的实施:

  • 两个循环只创建一个额外的迭代器对象,因此内存资源大致相同(因为对于合理的实现,迭代器对象本身非常简单。)
  • 时间资源取决于您在循环中执行的操作。如果你只需要密钥,它们也大致相同。如果你需要从密钥中检索值,你需要更多的运行时间,但我认为这不会产生很大的影响。
  • 总的来说,我认为如果选择一个实现只是因为它在资源方面的最小优势,那么差异是如此之小以至于过早优化

答案 3 :(得分:1)

你是什么意思?存储器?

在这两种情况下,你都会在循环中使用一个对象引用beng - 无论是入口还是键。在任何情况下都不会创建其他对象。两者在性能和资源使用方面或多或少都相同。

答案 4 :(得分:1)

你为什么担心资源?这真的是一个实际的,合理的问题还是过早优化的情况?

从设计的角度来看,如果你需要处理键和值而不仅仅是键,我会使用entryset。不是从性能的角度来看,但从实际的设计角度来看,如果你使用的不是密钥,你就可以更清楚地了解地图中的条目。 (当然,如果您只是使用键做某事,请使用键集。)

正如其他人从性能角度提到的那样,在不了解实施细节的情况下无法分辨,但除非您正在做一些非常具体的事情或处理大量地图,否则这不应成为问题。