Comparación de la eficiencia de atravesar la colección de mapas en diferentes métodos en 3 escenarios

Caso de prueba

//HashMap1:大小为1000000,
//key和value的值均为String,
//key的值为1、2、3.........1000000
Map<String,String> map1 =new HashMap<String,String>();
String key1,value1;
for(int i=1;i<=1000000;i++){
    
    
    key1 = ""+i;
    value1="value"+i;
    map1.put(key1,value1);
}

//HashMap2:大小为1000000,
//key和value的值为String,
//key的值为50、100、150........50000000
Map<String,String> map2 = new HashMap<String,String>();
String key2,value2;
for(int i=1;i<=1000000;i++){
    
    
    key2=""+(i*50);
    value2="value"+key2;
    map2.put(key2,value2);
}

escenarios de prueba

Tecla transversal + valor al mismo tiempo

keySet usa Iterator para atravesar

public static long keySet_Iterator(Map<String, String> map) {
    
    
    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
    
    
        key=iter.next();
        value=map.get(key);
    }
    long endTime1 =System.currentTimeMillis();
    return endTime1-startTime1;
}

keySet utiliza for para atravesar

public static long keySet_for(Map<String, String> map) {
    
    
    long startTime2 =System.currentTimeMillis();
    for(String key3:map.keySet()){
    
    
        value=map.get(key3);
    }
    long endTime2 =System.currentTimeMillis();
    return endTime2-startTime2;
}

entrySet usa Iterator para atravesar

public static long entrySet_Iterator(Map<String, String> map) {
    
    
    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){
    
    
        entry3 = iter3.next();
        key = entry3.getKey();
        value=entry3.getValue();
    }
    long endTime3 =System.currentTimeMillis();
    return endTime3-startTime3;
}

entrySet utiliza for para atravesar

public static long entrySet_for(Map<String, String> map) {
    
    
    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){
    
    
        key=entry4.getKey();
        value=entry4.getValue();
    }
    long endTime4 =System.currentTimeMillis();
    return endTime4-startTime4;
}

Solo atraviesa la llave

keySet usa Iterator para atravesar

public static long keySet_Iterator(Map<String, String> map) {
    
    
    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
    
    
    	key=iter.next();
    }
    long endTime1 =System.currentTimeMillis();
    return endTime1-startTime1;
}

keySet utiliza for para atravesar

public static long keySet_for(Map<String, String> map) {
    
    
    long startTime2 =System.currentTimeMillis();
    for(String key3:map.keySet()){
    
    
	
    }
    long endTime2 =System.currentTimeMillis();
    return endTime2-startTime2;
}

entrySet usa Iterator para atravesar

public static long entrySet_Iterator(Map<String, String> map) {
    
    
    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){
    
    
    	key = iter3.next().getKey();
    }
    long endTime3 =System.currentTimeMillis();
    return endTime3-startTime3;
}

entrySet utiliza for para atravesar

public static long entrySet_for(Map<String, String> map) {
    
    
    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){
    
    
	    key=entry4.getKey();
    }
    long endTime4 =System.currentTimeMillis();
    return endTime4-startTime4;
}

Solo valor transversal

keySet usa Iterator para atravesar

public static long keySet_Iterator(Map<String, String> map) {
    
    
    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
    
    
		value=map.get(iter.next());
    }
    long endTime1 =System.currentTimeMillis();
    return endTime1-startTime1;
}

keySet utiliza for para atravesar

public static long keySet_for(Map<String, String> map) {
    
    
    long startTime2 =System.currentTimeMillis();
    for(String key3:map.keySet()){
    
    
        value=map.get(key2);
    }
    long endTime2 =System.currentTimeMillis();
    return endTime2-startTime2;
}

entrySet usa Iterator para atravesar

public static long entrySet_Iterator(Map<String, String> map) {
    
    
    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){
    
    
		value=iter3.next().getValue();
    }
    long endTime3 =System.currentTimeMillis();
    return endTime3-startTime3;
}

entrySet utiliza for para atravesar

public static long entrySet_for(Map<String, String> map) {
    
    
    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){
    
    
		value=entry4.getValue();
    }
    long endTime4 =System.currentTimeMillis();
    return endTime4-startTime4;
}

Los valores se atraviesan mediante un iterador

public static values_Iterator(Map<String, String> map) {
    
    
    long startTime5=System.currentTimeMillis();
    Iterator<String>  iter5=map.values().iterator();
    while (iter5.hasNext()){
    
    
        value=iter5.next();
    }
    long endTime5 =System.currentTimeMillis();
    return endTime5-startTime5;
}

uso de valores para el recorrido

public static values_for(Map<String, String> map) {
    
    
	long startTime6=System.currentTimeMillis();
    for(String value6:map.values()){
    
    

    }
    long endTime6 =System.currentTimeMillis();
    return endTime6-startTime6;
}

Resultados de la prueba

Tecla transversal + valor al mismo tiempo

Tecla transversal + valor al mismo tiempo Pequeña cantidad de datos Gran cantidad de datos
keySet usa Iterator para atravesar 124ms 126 ms
keySet utiliza for para atravesar 105 ms 113 ms
entrySet usa Iterator para atravesar 80 ms 100 ms
entrySet utiliza for para atravesar 78 ms 103 ms

Solo atraviesa la llave

Solo atraviesa la llave Pequeña cantidad de datos Gran cantidad de datos
keySet usa Iterator para atravesar 97 ms 118 ms
keySet utiliza for para atravesar 93ms 114 ms
entrySet usa Iterator para atravesar 95ms 115ms
entrySet utiliza for para atravesar 95ms 113 ms

Solo valor transversal

Solo valor transversal Pequeña cantidad de datos Gran cantidad de datos
keySet usa Iterator para atravesar 125 ms 146 ms
keySet utiliza for para atravesar 114 ms 140 ms
entrySet usa Iterator para atravesar 102 ms 120 ms
entrySet utiliza for para atravesar 104 ms 121ms
Los valores se atraviesan mediante un iterador 97 ms 124ms
uso de valores para el recorrido 107 ms 114 ms

resumen

  1. Cuando la clave del mapa tiene una forma simple y una forma compleja, la eficiencia de la búsqueda es diferente y el valor de la clave simple es más eficiente
  2. Cuando la cantidad de datos es grande, la eficiencia de usar entrySet para recorrer key + value es mayor que la de keySet

Es por eso que "recomienda usar entrySet, pensando que entrySet es más rápido para buscar grandes cantidades de datos".

  1. Cuando solo necesitamos obtener el valor del valor, usar valores para recorrer es más eficiente

Supongo que te gusta

Origin blog.csdn.net/weixin_43438052/article/details/113919663
Recomendado
Clasificación