锁定老帖子 主题:Java Map遍历速度最优解
精华帖 (0) :: 良好帖 (1) :: 新手帖 (15) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-11
引用 对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value
多了一次get(key),不过哈希的get效率是很高的 |
|
返回顶楼 | |
发表时间: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都不过 |
|
返回顶楼 | |
发表时间:2011-12-12
# hashMap内部的存储结构就是Entry<key, value>的数组,Entry对象里面直接包含了key和value,用entrySet的方式,只需要把数组遍历一遍
# 而用keySet的方式,每次都要通过key去计算hash,然后再通过hash获得value,所以效率比较低 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间:2011-12-12
阅读过源码的应该会很清楚这个问题。
|
|
返回顶楼 | |
发表时间:2011-12-12
keyset运行时间:15ms
entrySet运行时间:16ms |
|
返回顶楼 | |
发表时间:2011-12-13
一直用get和put的路过
|
|
返回顶楼 | |