java - 해쉬 - 해시맵




HashMap을 반복합니다. (5)

가능한 중복 :
'지도'의 각 항목을 효율적으로 반복하는 방법은 무엇입니까?

HashMap 의 항목을 반복하는 가장 좋은 방법은 무엇입니까?


달려있어. 모든 항목의 키와 값이 모두 필요하다고 판단되면 entrySet 살펴보십시오. 그냥 값이 필요한 경우 values() 메소드가 있습니다. 그리고 키가 필요하면 keyset() 을 사용하십시오.

나쁜 연습은 모든 키를 반복하고 루프 내에서 항상 map.get(key) 를 수행하여 값을 가져 오는 것입니다. 당신이 그렇게한다면, 내가 쓴 첫 번째 옵션은 당신을위한 것입니다.


더 똑똑한 :

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

참조에서 추출 Java에서 맵을 반복하는 방법 :

Java에서 Map 을 반복하는 여러 가지 방법이 있습니다. 가장 일반적인 방법을 검토하고 장점과 단점을 검토하십시오. Java의 모든 맵은 Map 인터페이스를 구현하므로 다음과 같은 기술이 모든 맵 구현 ( HashMap , TreeMap , LinkedHashMap , Hashtable 등)에서 작동합니다.

방법 # 1 : For-Each 루프를 사용하여 항목을 반복합니다.

이것은 가장 일반적인 방법이며 대부분의 경우에 적합합니다. 루프에서 맵 키와 값이 모두 필요할 경우 사용해야합니다.

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

For-Each 루프는 Java 5에서 도입되었으므로이 방법은 최신 버전의 언어에서만 작동합니다. 또한 For-Each 루프는 null 인 맵을 반복 할 경우 NullPointerException 발생 시키므로 반복하기 전에 항상 null 참조를 확인해야합니다.

방법 2 : For-Each 루프를 사용하여 키 또는 값을 반복합니다.

맵에서 키 또는 값만 필요하면 entrySet 대신 keySet 또는 값을 반복 할 수 있습니다.

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

이 방법은 entrySet 반복 (약 10 % 빠름)보다 약간의 성능 이점을 제공하며보다 깨끗합니다.

방법 3 : Iterator를 사용하여 반복.

Generics 사용 :

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

제네릭이없는 경우 :

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

동일한 기술을 사용하여 keySet 또는 값을 반복 할 수도 있습니다.

이 방법은 중복 된 것처럼 보일 수 있지만 자체 장점이 있습니다. 우선, 이전 버전의 Java에서지도를 반복하는 유일한 방법입니다. 다른 중요한 기능은 iterator.remove() 를 호출하여 반복 중에지도에서 항목을 제거 할 수있는 유일한 방법이라는 것입니다. For-Each 반복 중에이 작업을 수행하려고하면 Javadoc 에 따라 "예측할 수없는 결과"가 나타납니다.

성능 관점에서 볼 때이 방법은 For-Each 반복과 같습니다.

방법 # 4 : 키 반복 및 값 검색 (비효율적).

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

이것은 메소드 # 1에 대한보다 깔끔한 대안처럼 보일 수 있지만, 키에 의해 값을 얻는 것은 시간 소모적 일 수 있기 때문에 실제로 느리고 비효율적입니다 (다른 Map 구현에서이 메소드는 메소드 # 1보다 20 % -200 % 느립니다). ). FindBugs를 설치하면,이를 감지하고 비효율적 인 반복에 대해 경고합니다. 이 방법은 피해야합니다.

결론:

지도에서 키 또는 값만 필요하면 방법 # 2를 사용하십시오. 이전 버전의 Java (5 미만)가 붙어 있거나 반복 중에 항목을 제거하려는 경우 # 3 방법을 사용해야합니다. 그렇지 않으면 방법 # 1을 사용하십시오.


키에만 관심이 있다면지도의 keySet() 을 반복 할 수 있습니다.

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

값만 필요하면 values() .

for (Object value : map.values()) {
    // ...
}

마지막으로, 키와 값을 모두 원하면 entrySet() .

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}

한가지주의 할 점 : 아이템을 중간에서 제거하고 싶다면, 반복기를 통해 아이템을 제거해야합니다 ( karim79의 답변 참조). 그러나 항목 값을 변경하면 OK입니다 ( Map.Entry 참조).


for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}




iteration