2009-06-10 3 views

답변

42

당신은

myMap.keySet().iterator(); 

당신은 심지어 존재 알 필요가 없습니다를 호출하여 그것을 얻을; 이것은 구현의 인공물 일뿐입니다. 아시다시피, 그들은 원숭이를 사용하여 키를 반복 할 수 있습니다. 사양에 따라 반복되는 한, 어떻게 작동하는지 상관하지 않습니다. 그런데

, 당신은 HashMapKeyIterator라는 개인 클래스가 알고 않았다 (로 할 ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, IdentityHashMap, TreeMapWeakHashMap)?
HashMap의 키를 반복하는 방법에 차이가 있습니까?


편집 : 귀하의 코멘트에 reponse에, 당신은 Map에 모든 키 - 값 쌍을 반복하려는 경우 점에 유의, 키 반복하고 호출하는 것보다 더 좋은 방법이있다 각각 getentrySet() 메서드는 모든 키 - 값 쌍 중 Set을 가져 와서 반복 할 수 있습니다. 그래서 그 대신 쓰기의 :

for (Key key : myMap.keySet()) { 
    Value val = myMap.get(key); 
    ... 
} 

당신이 작성해야 : 당신이 원하는 경우

for (Map.Entry<Key, Value> entry : myMap.entrySet()) { 
    doSomethingWithKey(entry.getKey()); 
    doSomethingWithValue(entry.getValue()); 
    ... 
} 

또한 values()으로 값을 반복 할 수있다. keySet, entrySetvaluesMap interface에 정의되어 있기 때문에, 그들은뿐만 아니라 LinkedHashMap 어떤 Map을 위해 작동합니다

참고.

+1

내부 전용 클래스를 찾을 때까지 LinkedHashMap을 반복 할 수 있다는 사실이 발생하지 않았습니다. 답변을 주셔서 감사합니다. –

+0

나는 entrySet()의 사용법을 모른다. 하지만, 거의 모든 곳에서 유용합니다. HashMap을 사용합니다. 감사합니다. @ 마이클 – sravanreddy001

3

LinkedHashMap의 내부 구현 (즉, 소스 코드에서 정의되었지만 API에서는 정의되지 않음)의 일부로 정의 된 것을 사용하면 안됩니다. 다음 릴리스에서 내부 구현이 변경되면 어떻게됩니까? 그것을 사용하는 모든 코드가 중단됩니다.

당신은 API 코드 및

myMap.keySet().iterator() 
3

직접 사용할 수 있도록 그것은, 개인 클래스처럼 뭔가를해야한다.

private class KeyIterator extends LinkedHashIterator<K> { 

일반 Iterator를 사용하면 인스턴스가 반환됩니다.

myMap.keySet().iterator() 
관련 문제