论坛首页 Java企业应用论坛

Java Map遍历速度最优解

浏览 14931 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (15) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-11  
引用
对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value

多了一次get(key),不过哈希的get效率是很高的
0 请登录后投票
   发表时间:2011-12-11  
Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
Object key = iter.next(); 
Object val = map.get(key); 


这种findbugs都不过
0 请登录后投票
   发表时间:2011-12-12  
# hashMap内部的存储结构就是Entry<key, value>的数组,Entry对象里面直接包含了key和value,用entrySet的方式,只需要把数组遍历一遍
# 而用keySet的方式,每次都要通过key去计算hash,然后再通过hash获得value,所以效率比较低
0 请登录后投票
   发表时间:2011-12-12  
jiyanliang 写道
Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
Object key = iter.next(); 
Object val = map.get(key); 


这种findbugs都不过



Bug: Method com.test.Test.main(String[]) makes inefficient use of keySet iterator instead of entrySet iterator
Pattern id: WMI_WRONG_MAP_ITERATOR, type: WMI, category: PERFORMANCE


This method accesses the value of a Map entry, using a key that was retrieved from a keySet iterator. It is more efficient to use an iterator on the entrySet of the map, to avoid the Map.get(key) lookup.
0 请登录后投票
   发表时间:2011-12-12  
阅读过源码的应该会很清楚这个问题。
0 请登录后投票
   发表时间:2011-12-12  
keyset运行时间:15ms
entrySet运行时间:16ms
0 请登录后投票
   发表时间:2011-12-13  
一直用get和put的路过
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics