HashMap海量数据时的常用遍历性能比较

以下的性能测试在10000以上的数据量才会大有体现,在较小的数据量时会出现keyset所耗时间比entrySet旗鼓相当



public class MapTest {

public static void main(String [] args){

Map map = new HashMap();

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 map){
long beginTime = System.currentTimeMillis();
for(Map.Entry 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 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是一样的


你可能感兴趣的:(JAVA基础)