[Java] Java에서 Map 관련 Iterate(반복문) 방법
Java에서 Map 관련하여 반복문을 사용하는 경우가 여러가지가 있다. 가장 많이 쓰이는 몇가지를 살펴보고 장단점을 알아보도록한다. Java의 모든 map들은 Map interface를 사용하므로 다음 경우들은 모든 map에 대하여 사용 가능하다.
예 : HashMap, TreeMap, LinkedMap, Hashtable 등등..
1. Entry 에 For-Each Loop 사용
가장 일반적이고 거의 모든 경우에 사용된다. 반복문 안에 key값과 value값이 전부 필요할때 사용한다.
1 2 3 4 | Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } | cs |
참고 : For-Each Loop는 Java 5이상에서 사용가능하다. 또한 NullPointerExecption을 발생 시킬 수 있으므로 null 체크를 하도록 하자.
2. Key Value 에 For-Each Loop사용
entry 대신 key값이나 value 값만 필요할 때 사용한다.
1 2 3 4 5 6 7 8 9 10 11 | Map<Integer, Integer> map = new HashMap<Integer, Integer>(); //iterating over keys only for (Integer key : map.keySet()) { System.out.println("Key = " + key); } //iterating over values only for (Integer value : map.values()) { System.out.println("Value = " + value); } | cs |
entrySet을 사용할 때보다 약 10%정도 빠르다.
3. Iterator 사용
- Generic 사용
1 2 3 4 5 6 | Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<Integer, Integer> entry = entries.next(); System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } | cs |
- Generic 미사용
1 2 3 4 5 6 7 8 | Map map = new HashMap(); Iterator entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Map.Entry) entries.next(); Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); System.out.println("Key = " + key + ", Value = " + value); } | cs |
keySet이나 values 에도 똑같이 적용가능하다. 이 방법은 오래된 방법이지만 Java 버전이 낮은 경우에 유일하게 사용가능한 방법이다. 또 한가지 중요한 장점은 반복문을 사용하는 도중에 iterator.remove()를 통해 항목들을 삭제할 수 있는 유일한 방법이다. 만약 삭제 작업을 For-Each 구문에서 사용한다면 "unpredictable results"를 얻게된다(javadoc, Map은 순서를 보장하지 않기 때문에). 성능 측면에서 For-Each와 비슷하다.
4. Key값으로 Value를 찾는 반복문
코드상으로는 간단해 보이지만 1번 방법에 비해 비효율적이고 성능면에서 안좋은 방법이다. key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모된다.(1번 방법보다 약 20%~200% 성능저하가 있음)
1 2 3 4 5 | Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Integer key : map.keySet()) { Integer value = map.get(key); System.out.println("Key = " + key + ", Value = " + value); } | cs |