给定以下代码,并使用两种可选的方法对其进行迭代,
这两种方法在性能上有什么区别吗?
Map<String, Integer> map = new HashMap<String, Integer>();
//populate map
//alt. #1
for (String key : map.keySet())
{
Integer value = map.get(key);
//use key and value
}
//alt. #2
for (Map.Entry<String, Integer> entry : map.entrySet())
{
String key = entry.getKey();
Integer value = entry.getValue();
//use key and value
}
我倾向于认为alt. #2
是迭代整个map
的更有效的方法(但我可能错了)。
发布于 2011-04-29 08:24:51
第二个选项肯定更有效率,因为与第一个选项中的n次相比,您只需要查找一次。
但是,没有什么比在你可以的时候尝试更好的了。所以是这样的-
(不是很完美,但足以在我的机器上验证假设)
public static void main(String args[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
// populate map
int mapSize = 500000;
int strLength = 5;
for(int i=0;i<mapSize;i++)
map.put(RandomStringUtils.random(strLength), RandomUtils.nextInt());
long start = System.currentTimeMillis();
// alt. #1
for (String key : map.keySet()) {
Integer value = map.get(key);
// use key and value
}
System.out.println("Alt #1 took "+(System.currentTimeMillis()-start)+" ms");
start = System.currentTimeMillis();
// alt. #2
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
// use key and value
}
System.out.println("Alt #2 took "+(System.currentTimeMillis()-start)+" ms");
}
RESULTS (一些有趣的)
使用int mapSize = 5000; int strLength = 5;
Alt #1耗时26毫秒
Alt #2耗时20毫秒
使用int mapSize = 50000; int strLength = 5;
Alt #1耗时32毫秒
Alt #2耗时20毫秒
使用int mapSize = 50000; int strLength = 50;
Alt #1耗时22毫秒
Alt #2耗时21毫秒
使用int mapSize = 50000; int strLength = 500;
Alt #1耗时28毫秒
Alt #2耗时23毫秒
使用int mapSize = 500000; int strLength = 5;
Alt #1耗时92毫秒
Alt #2耗时57毫秒
...and等
发布于 2011-04-29 08:00:25
第二个代码片段会稍微快一些,因为它不需要重新查找键。
所有HashMap
迭代器都调用nextEntry
method,后者返回一个Entry<K,V>
。
第一个代码片段丢弃条目中的值(在KeyIterator
中),然后再次在字典中查找它。
您的第二个代码片段直接使用键和值(来自EntryIterator
)
( keySet()
和entrySet()
都是廉价的调用)
发布于 2014-10-02 02:51:39
映射:
Map<String, Integer> map = new HashMap<String, Integer>();
除了两个选项之外,还有一个选项。
1) keySet() -如果您只需要使用 keys,请使用它
for ( String k : map.keySet() ) {
...
}
2) entrySet() -如果您需要同时使用它:keys & values
for ( Map.Entry<String, Integer> entry : map.entrySet() ) {
String k = entry.getKey();
Integer v = entry.getValue();
...
}
3) values() -如果您只需要 values,则可以使用它
for ( Integer v : map.values() ) {
...
}
https://stackoverflow.com/questions/5826384
复制相似问题