immutable java order iteration guava

java - immutable map of



Orden de iteraciĆ³n de Google Collections ImmutableMap (3)

Necesito la combinación de Google Collection ImmutableMap y LinkedHashMap : mapa inmutable con orden de iteración definido. Parece que el propio ImmutableMap en realidad ha definido el orden de iteración, al menos su documentación dice :

Un mapa inmutable, basado en hash con orden de iteración especificado por el usuario confiable.

Sin embargo no hay más detalles. La prueba rápida muestra que esto podría ser cierto, pero quiero asegurarme. Desafortunadamente, el rápido vistazo a las fuentes no me ayudó mucho.

Mi pregunta es: ¿puedo confiar en el orden de iteración de ImmutableMap? Si hago ImmutableMap.copyOf(linkedHashMap) , ¿tendrá el mismo orden de iteración que el mapa hash vinculado original? ¿Qué pasa con los mapas inmutables creados por el constructor? Algún enlace a la respuesta autorizada ayudaría, ya que Google no encontró nada útil. (Y no, los enlaces a las fuentes no cuentan).


De hecho, he encontrado discusión sobre esto, con respuestas de autores de bibliotecas :

Kevin Bourrillion: Lo que entendemos por "especificado por el usuario" es "puede ser el orden que desee"; en otras palabras, sea cual sea el orden en que nos proporcione las entradas en primer lugar, ese es el orden que utilizamos.

Jared Levy: También puede copiar un TreeMap o LinkedHashMap que tenga el orden deseado.

Sí, debería haber creído el javadoc, aunque creo que el javadoc puede ser mejor en este caso. Parece que no soy el primero que se confundió con eso. Si nada más, este Q / A ayudará a Google la próxima vez que alguien busque "iteración de ImmutableMap" :-)


Deberías creer el javadoc. Si no es suficiente, lea el código fuente o reporte el error.

Una vista rápida del código fuente muestra que el mapa está respaldado por una matriz y la iteración se realizará a través de ImmutableSet que también está respaldado por una matriz. Así que creo que la documentación es correcta y el orden de los elementos se mantendrá tal como está.


Para ser más precisos, los métodos de fábrica y constructor de ImmutableMap devuelven instancias que siguen el orden de iteración de las entradas proporcionadas cuando se construyó el mapa. Sin embargo, un ImmutableSortedMap, que es una subclase de ImmutableMap. ordena las llaves.