2015-01-05 4 views
4

동료가 코드의 후발 코드가 더 효율적이라고 말한 오늘 팁을 보냈습니다. 이전 코드와 같이 모든 반복에서 맵에서 조회를 수행 할 필요가 없으므로 1).키 집합을 반복 할 때와 항목 집합을 반복 할 때

# 2 (후자)가 더 효율적입니까? 나는 # 1과 # 2가 어떻게 다른지 이해하지 못한다.

**#1 snippet**

:

for (String key : map.keySet()) 
{ 
    String value = map.get(key); // does lookup for every key 
    // do something with value 
} 

**#2 snippet** :

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

답변

9

문제는 map.entrySet() 반복하는 것은 보통 map.keySet() 반복만큼 싼 반면 map.get 보통, 중요한 일정 요소 비용을 가지고 있다는 것입니다.

이 첫 번째 루프가 실제로 O (N N 로그)와 두 번째 루프 것이라고 할 수 O (n)이 있지만,도에 대한 HashMap, getTreeMap, 같은 것들에 가장 중요하다 일정한 요인 비용이 그 두 번째 루프로 피할 수 있습니다.

1

루프의 내부 부분이 기본적으로 속성을 가져 오기위한 두 가지 호출이므로 Snippet # 2는 더 빠를 수 있습니다.

스 니펫 # 1에서 각 반복 단계마다 key에 잘못된 해시 코드가 있으면 O(n) 작업 중 최악의 경우 인 map.get을 호출합니다. 좋은 해시 코드가 있어도 올바른 버킷을 찾고 value을 가져 오는 것과 관련된 일정한 비용이 있습니다. 난 당신이 # 1과 # 2를 혼합 생각

final class KeyIterator extends HashIterator 
    implements Iterator<K> { 
    public final K next() { return nextNode().key; } 
} 

final class EntryIterator extends HashIterator 
    implements Iterator<Map.Entry<K,V>> { 
    public final Map.Entry<K,V> next() { return nextNode(); } 
} 
+1

: 그들은 모두가 HashIterator을 사용할 때 두 버전에 대한 HashMaps을의 경우 반복이 동일하다는 것을

주? –

+0

맞습니다. 교체해야합니다. – Wickoo

관련 문제