2009-06-10 13 views

Respuesta

42

usted lo consigue llamando

myMap.keySet().iterator(); 

Ni siquiera debería tener que saber que existe; es solo un artefacto de la implementación. Por lo que sé, podrían estar usando monos voladores para iterar las teclas; siempre y cuando se iteren según la especificación, no importa cómo lo hagan.

Por cierto, ¿sabía usted que HashMap tiene una clase privada llamada KeyIterator (al igual que ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, IdentityHashMap, TreeMap y WeakHashMap)?
¿Eso hace una diferencia en cómo iterar a través de las teclas de HashMap?


Editar: En respuesta a los su comentario, tenga en cuenta que si usted está tratando de iterar sobre todos los pares clave-valor en un Map, hay una manera mejor que iterar sobre las claves y llamando get para cada uno. El método entrySet() obtiene un Set de todos los pares clave-valor que luego puede iterar. Así que en lugar de escribir:

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

debe escribir:

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

También puede iterar sobre los valores con los values() si lo desea.

Nota que desde keySet, entrySet y values se definen en el Map interface, que van a trabajar para cualquier Map, no sólo LinkedHashMap.

+1

Simplemente no se me ocurrió que podía iterar sobre un LinkedHashMap hasta que vi la clase privada interna. Gracias por la respuesta sin embargo. –

+0

No sabía para qué uso es entrySet() de. Pero, es realmente útil en casi todos los lugares, uso un HashMap. Gracias @Michael – sravanreddy001

3

No debe usar nada que esté definido como parte de la implementación interna de LinkedHashMap (es decir, en el código fuente pero no está definido en la API). ¿Qué sucede si la implementación interna cambia en la próxima versión? Todo tu código lo usará se romperá.

las que debería escribir a la API y hacer algo como

myMap.keySet().iterator() 
3

Es una clase privada, por lo que no se puede utilizar directamente.

private class KeyIterator extends LinkedHashIterator<K> { 

Se devuelve una instancia cuando se utiliza el iterador normal.

myMap.keySet().iterator() 
Cuestiones relacionadas