我一直在寻找一种最好的方法来循环一个涉及尽可能少资源的地图。假设我有一个对象作为值,键是一个引用该对象的字符串。通过以下两个循环,我可以知道哪一个更好,你是如何证明它只运行最少的资源?
for(Map.Entry<String, MyObject> entry : myMap.entrySet()) {
...
}
for( String key : myMap.keySet() ) {
...
}
谢谢@!
答案 0 :(得分:5)
这取决于您使用的具体Map
。由于Map
是一个界面,因此无法分辨它是什么。
在大多数地图实施中,entrySet
和keySet
都会返回基础条目/键集的视图,所以我会说它们可能更多或者在所有方面都不那么有效。
请注意,如果您检索所有条目,则表示您同时获取了这些值。如果您经常需要值,这可能会节省您一些时间。
答案 1 :(得分:4)
我相信以下内容更有效:
for(Map.Entry<String, MyObject> entry : myMap.entrySet()) {
...
}
这是因为它可能根据Map实现对集合进行简单的迭代。另一方面,如果您遍历键,然后使用键调用Map的 get 方法,则不仅要迭代一组键,还要执行查找以从中检索每个元素。地图。
答案 2 :(得分:2)
对于通常/合理的实施:
答案 3 :(得分:1)
你是什么意思?存储器?
在这两种情况下,你都会在循环中使用一个对象引用beng - 无论是入口还是键。在任何情况下都不会创建其他对象。两者在性能和资源使用方面或多或少都相同。
答案 4 :(得分:1)
你为什么担心资源?这真的是一个实际的,合理的问题还是过早优化的情况?
从设计的角度来看,如果你需要处理键和值而不仅仅是键,我会使用entryset。不是从性能的角度来看,但从实际的设计角度来看,如果你使用的不是密钥,你就可以更清楚地了解地图中的条目。 (当然,如果您只是使用键做某事,请使用键集。)
正如其他人从性能角度提到的那样,在不了解实施细节的情况下无法分辨,但除非您正在做一些非常具体的事情或处理大量地图,否则这不应成为问题。