3つのシナリオでのさまざまな方法でのMapコレクションのトラバースの効率の比較

テストケース

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

テストシナリオ

キーと値を同時にトラバースします

keySetはイテレータを使用してトラバースします

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はをトラバースするために使用します

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はIteratorを使用してトラバースします

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はをトラバースするために使用します

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

キーをトラバースするだけ

keySetはイテレータを使用してトラバースします

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はをトラバースするために使用します

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はIteratorを使用してトラバースします

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はをトラバースするために使用します

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

トラバース値のみ

keySetはイテレータを使用してトラバースします

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はをトラバースするために使用します

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はIteratorを使用してトラバースします

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はをトラバースするために使用します

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

値はイテレータを使用してトラバースされます

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

トラバーサルに使用する値

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

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

試験結果

キーと値を同時にトラバースします

キーと値を同時にトラバースします 少量のデータ 大量のデータ
keySetはイテレータを使用してトラバースします 124ms 126ms
keySetはをトラバースするために使用します 105ms 113ms
entrySetはIteratorを使用してトラバースします 80ms 100ms
entrySetはをトラバースするために使用します 78ms 103ms

キーをトラバースするだけ

キーをトラバースするだけ 少量のデータ 大量のデータ
keySetはイテレータを使用してトラバースします 97ms 118ms
keySetはをトラバースするために使用します 93ms 114ms
entrySetはIteratorを使用してトラバースします 95ms 115ms
entrySetはをトラバースするために使用します 95ms 113ms

トラバース値のみ

トラバース値のみ 少量のデータ 大量のデータ
keySetはイテレータを使用してトラバースします 125ms 146ms
keySetはをトラバースするために使用します 114ms 140ms
entrySetはIteratorを使用してトラバースします 102ms 120ms
entrySetはをトラバースするために使用します 104ms 121ms
値はイテレータを使用してトラバースされます 97ms 124ms
トラバーサルに使用する値 107ms 114ms

概要

  1. マップのキーが単純な形式と複雑な形式の場合、検索効率が異なり、単純なキー値の方が効率的です。
  2. データ量が多い場合、entrySetを使用してkey + valueをトラバースする効率は、keySetよりも高くなります。

これが、「entrySetは大量のデータを検索する方が速いと考えて、entrySetを使用することをお勧めします」という理由です。

  1. 値の値を取得するだけでよい場合は、値を使用してトラバースする方が効率的です

おすすめ

転載: blog.csdn.net/weixin_43438052/article/details/113919663