以下的性能测试在10000以上的数据量才会大有体现,在较小的数据量时会出现keyset所耗时间比entrySet旗鼓相当
public static void main(String [] args){
Map<String,Object> map = new HashMap<String,Object>();
for(int i =0;i<10000;i++){
map.put("A"+i,"A "+i+" object");
}
//调用entrySet遍历
entrySettravel(map);
System.out.println("-------------------------------- ");
System.out.println("\r\n方法二:");
//调用keySet遍历
keySettravel(map);
}
* 通过Map下的entry遍历
* @param map
* @param beginTime
*/
private static void entrySettravel(Map<String,Object> map){
long beginTime = System.currentTimeMillis();
for(Map.Entry<String,Object> entry:map.entrySet()){
entry.getValue();
}
//遍历完后所耗用时间
System.out.println("entrySettravel Time different = "+(System.currentTimeMillis()-beginTime));
}
/**
* 通过Map下的keySet遍历
* @param map
* @param beginTime
*/
private static void keySettravel(Map<String,Object> map){
long beginTime = System.currentTimeMillis();
for(String s:map.keySet()){
map.get(s);
}
System.out.println("\n-------------------------------- ");
System.out.println("keySettravel Time different = "+(System.currentTimeMillis()-beginTime));
}
}
结果:
entrySettravel Time different = 11
--------------------------------
方法二:
--------------------------------
keySettravel Time different = 14
但是如果把数据改成100的时候,也就是把循环上限减少到100:
出现的结果如下
entrySettravel Time different = 1
--------------------------------
方法二:
--------------------------------
keySettravel Time different = 1
总结:
因为调用entrySetMap.entrySet()方法会生成EntryIterator 迭代器,其next方法返回一个Entry对象的一个实例,其中包含key和value. 而调用keySet仅仅是获得一个key,此时我们还需要再循环一次才能获得value,但在少量数据的时候,keyset的性能与entrySet是一样的