Comparison of the efficiency of traversing the Map collection in different methods in 3 scenarios

Test case

//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);
}

testing scenarios

Traverse key+value at the same time

keySet uses Iterator to traverse

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 uses for to traverse

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 uses Iterator to traverse

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 uses for to traverse

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;
}

Only traverse the key

keySet uses Iterator to traverse

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 uses for to traverse

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 uses Iterator to traverse

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 uses for to traverse

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;
}

Only traverse value

keySet uses Iterator to traverse

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 uses for to traverse

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 uses Iterator to traverse

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 uses for to traverse

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;
}

Values ​​are traversed using iterator

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;
}

values ​​use for traversal

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

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

Test Results

Traverse key+value at the same time

Traverse key+value at the same time Small amount of data Big amount of data
keySet uses Iterator to traverse 124ms 126ms
keySet uses for to traverse 105ms 113ms
entrySet uses Iterator to traverse 80ms 100ms
entrySet uses for to traverse 78ms 103ms

Only traverse the key

Only traverse the key Small amount of data Big amount of data
keySet uses Iterator to traverse 97ms 118ms
keySet uses for to traverse 93ms 114ms
entrySet uses Iterator to traverse 95ms 115ms
entrySet uses for to traverse 95ms 113ms

Only traverse value

Only traverse value Small amount of data Big amount of data
keySet uses Iterator to traverse 125ms 146ms
keySet uses for to traverse 114ms 140ms
entrySet uses Iterator to traverse 102ms 120ms
entrySet uses for to traverse 104ms 121ms
Values ​​are traversed using iterator 97ms 124ms
values ​​use for traversal 107ms 114ms

summary

  1. When the key of the map is in a simple form and a complex form, the search efficiency is different, and the simple key value is more efficient
  2. When the amount of data is large, the efficiency of using entrySet to traverse key+value is higher than that of keySet

This is why "you recommend using entrySet, thinking that entrySet is faster for searching large amounts of data"

  1. When we only need to get the value value, using values ​​to traverse is more efficient

Guess you like

Origin blog.csdn.net/weixin_43438052/article/details/113919663