论坛首页 Java企业应用论坛

Java Map遍历速度最优解

浏览 14888 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (15) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-09  
    HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的

第一种:
Map map = new HashMap(); 
Iterator iter = map.entrySet().iterator(); 
while (iter.hasNext()) { 
Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); 
Object val = entry.getValue(); 

效率高,以后一定要使用此种方式!

第二种:
Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
Object key = iter.next(); 
Object val = map.get(key); 

效率低,以后尽量少使用!


    对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。

注:Hashtable的遍历方法和以上的差不多!
   发表时间:2011-12-10  
为啥不用entryset直接遍历呢?
Map<String, Object> map = new HashMap<String, Object>();
for (Entry<String, Object> entry : map.entrySet()) {
	String key = entry.getKey();
	Object value = entry.getValue();
}
0 请登录后投票
   发表时间:2011-12-10   最后修改:2011-12-10
map.values(); 如果你不关注key的话,还可以这样

ps: 第二种不是遍历了两次,而是多hash了一次(效率的差别,主要看key的hashCode具体算法)
0 请登录后投票
   发表时间:2011-12-10  
最好能给出测试数据,给出时间
0 请登录后投票
   发表时间:2011-12-10  
ol_beta 写道
为啥不用entryset直接遍历呢?
Map<String, Object> map = new HashMap<String, Object>();
for (Entry<String, Object> entry : map.entrySet()) {
	String key = entry.getKey();
	Object value = entry.getValue();
}

和LZ是一样的。只是语法形势换成心的了
0 请登录后投票
   发表时间:2011-12-10  
一直只是put和get!
0 请登录后投票
   发表时间:2011-12-10  
这是 基本常识
0 请登录后投票
   发表时间:2011-12-10  
liu78778 写道
ol_beta 写道
为啥不用entryset直接遍历呢?
Map<String, Object> map = new HashMap<String, Object>();
for (Entry<String, Object> entry : map.entrySet()) {
	String key = entry.getKey();
	Object value = entry.getValue();
}

和LZ是一样的。只是语法形势换成心的了


不知道呃,可能要看看编译过后的结果才知道一不一样,我一直是用entrySet直接遍历的
0 请登录后投票
   发表时间:2011-12-11  
/**
 * 
 */

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTest {
	public static void main(String[] args) {
		Map map=new HashMap();
		for(int i=0;i<100000;i++){
			map.put(String.valueOf(i), "hello world!");
		}
		long start=System.currentTimeMillis(); 
		Iterator it=map.keySet().iterator();
		while(it.hasNext()){
			String key=(String) it.next();
			map.get(key);
		}
		long end=System.currentTimeMillis();
		System.out.println("keyset运行时间:"+(end-start)+"ms");
		
		start=System.currentTimeMillis(); 
		it=map.entrySet().iterator();
		while(it.hasNext()){
			 java.util.Map.Entry entry = (java.util.Map.Entry) it.next(); 
			 entry.getValue();
		}
		end=System.currentTimeMillis();
		System.out.println("entrySet运行时间:"+(end-start)+"ms");	
	}
}

keyset运行时间:7ms
entrySet运行时间:5ms
 
是有区别
0 请登录后投票
   发表时间:2011-12-11  
zhang_xiujiao 写道
map.values(); 如果你不关注key的话,还可以这样

ps: 第二种不是遍历了两次,而是多hash了一次(效率的差别,主要看key的hashCode具体算法)

0 请登录后投票
论坛首页 Java企业应用版

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