HashMapIteration.java
0.00MB

필요한 기능 

1. Iterator : Iterator는 Java Collection Framework에 속하는 컬렉션 객체들(Map과 List interface를 상속받은 객체들)에 저장되어있는 value를 읽어오는 방법을 표준화하기위한 interface이다. 

2. entrySet & keySet : HashMap의 Loop를 실행하고 데이터를 사용하기 위해서는 HashMap이 가지는 Key를 알 필요가 있다. Key를 알아내기 위한 수단으로 사용할 method들이다.

 

비교할 대상

실행 시간을 비교할 조건은 Iterator의 사용 유무와 HashMap의 Key 조회 방법, 그리고 HashMap과 LinkedHashMap간의 차이를 비교할 것이다. 

그리고 하는 김에 ArrayList의 loop도 비교해볼 것이다. 

 

테스트 환경

jdk 1.8

 

테스트 방법 

간단하게 HashMap에 숫자를 0~1000000까지 넣고 반복문을 돌릴 것이다.

 

사용할 변수 선언 및 초기화 

1
2
3
4
5
6
7
8
9
10
11
12
13
    static HashMap<String,Integer> testMap = new HashMap<String,Integer>();
    static LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
    static ArrayList<Integer> arrayList = new ArrayList<Integer>();
 
    static
    {
        for(int i=0; i< 1000000; i++)
        {
            testMap.put("key_" + i, i);
            linkedHashMap.put("key_" + i, i);
            arrayList.add(i);
        }
    }
 
 

 

HashMap

[HashMap, entrySet]

1
2
3
4
5
6
startTime = Calendar.getInstance().getTimeInMillis();
for (Map.Entry<String,Integer> entry : testMap.entrySet()) {
    entry.getKey();
    entry.getValue();
}
System.out.println("    1 Using entrySet() in for-each loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[HashMap, keySet]

1
2
3
4
5
startTime = Calendar.getInstance().getTimeInMillis();
for (String key : testMap.keySet()) {
    testMap.get(key);
}
System.out.println("    2 Using keySet() in for-each loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[HashMap, entrySet, Iterator]

1
2
3
4
5
6
7
8
9
10
startTime = Calendar.getInstance().getTimeInMillis();
Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator();
while(itr1.hasNext())
{
    Map.Entry<String,Integer> entry = itr1.next();
    entry.getKey();
    entry.getValue();
}
System.out.println("HashMap iterator loop");
System.out.println("    3 Using entrySet() and iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[HashMap, keySet, Iterator]

1
2
3
4
5
6
7
8
startTime = Calendar.getInstance().getTimeInMillis();
Iterator<String> itr2 = testMap.keySet().iterator();
while(itr2.hasNext())
{
    String key = itr2.next();
    testMap.get(key);
}
System.out.println("    4 Using keySet() and iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

 

LinkedHashMap

[LinkedHashMap, entrySet]

1
2
3
4
5
6
startTime = Calendar.getInstance().getTimeInMillis();
for (Map.Entry<String,Integer> entry : linkedHashMap.entrySet()) {
    entry.getKey();
    entry.getValue();
}
System.out.println("    1 LinkedHashMap entrySet() loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[LinkedHashMap, keySet]

1
2
3
4
5
startTime = Calendar.getInstance().getTimeInMillis();
for (String key : linkedHashMap.keySet()) {
    linkedHashMap.get(key);
}
System.out.println("    2 LinkedHashMap keySet() loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[LinkedHashMap, entrySet, Iterator]

1
2
3
4
5
6
7
8
9
startTime = Calendar.getInstance().getTimeInMillis();
Iterator<Map.Entry <String,Integer>> itr4 = linkedHashMap.entrySet().iterator();
while(itr4.hasNext())
{
    Map.Entry<String,Integer> entry = itr4.next();
    entry.getKey();
    entry.getValue();
}
System.out.println("    3 LinkedHashMap entrySet() iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[LinkedHashMap, keySet, Iterator]

1
2
3
4
5
6
7
8
startTime = Calendar.getInstance().getTimeInMillis();
Iterator<String> itr3 = linkedHashMap.keySet().iterator();
while(itr3.hasNext())
{
    String key = itr3.next();
    linkedHashMap.get(key);
}
System.out.println("    4 LinkedHashMap keySet() iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

 

ArrayList

[ArrayList]

1
2
3
4
5
startTime = Calendar.getInstance().getTimeInMillis();
for(int i = 0 ; i < arrayList.size() ; i ++) {
    arrayList.get(i);
}
System.out.println("    1 ArrayList loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

[ArrayList, Iterator]

1
2
3
4
5
6
startTime = Calendar.getInstance().getTimeInMillis();
Iterator<Integer> itr5 = arrayList.iterator();
while(itr5.hasNext()) {
    int val = itr5.next();
}
System.out.println("    2 ArrayList iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
 

 

실행 시간 결과 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HashMap just loop
    1 Using entrySet() in for-each loop : 65
    2 Using keySet() in for-each loop : 81
==================================
HashMap iterator loop
    3 Using entrySet() and iterator : 52
    4 Using keySet() and iterator : 60
==================================
LinkedHashMap just loop
    1 LinkedHashMap entrySet() loop : 45
    2 LinkedHashMap keySet() loop : 64
==================================
LinkedHashMap iterator loop
    3 LinkedHashMap entrySet() iterator : 43
    4 LinkedHashMap keySet() iterator : 56
==================================
    1 ArrayList loop : 22
    2 ArrayList iterator : 28
 

 

정리 

1. HashMap의 경우, entrySet이 keySet으로 순환하는 것 보다 더 빠르다. 그리고 Iterator로 순환하는 것이 아닌 것 보다 더 빠르다.

가장 빠른 것 : Iterator entrySet loop

 

2. LinkedHashMap의 경우, HashMap에 Link가 추가되어 있어 전체적으로 HashMap보다 실행 속도가 더 빠르다. 그리고 나머지 조건은 HashMap과 동일하게 entrySet이 keySet보다 더 빠른 것을 확인할 수 있다. 

가장 빠른 것 : Iterator entrySet loop

 

3. ArrayList의 경우, 이미 indexing이 되어 있기 때문에 별도의 Iterator 객체를 만들어 순환하는 것보다 그냥 size를 가지고 순환하는 것이 더 빠르다. 

가장 빠른 것 : non-Iterator loop

+ Recent posts