2010-03-14 27 views
124

Empecé a aprender Java. ¿Cuándo usaría un HashMap sobre un TreeMap?¿Cuál es la diferencia entre un HashMap y un TreeMap?

+22

Stackoverflow no es sólo para el autor de la pregunta cuestión, sino también para otras personas en busca de respuestas. Por lo tanto, está perfectamente bien para mí si encuentro aquí una respuesta que también está contenida en algún libro que no tengo ... –

Respuesta

195

TreeMap es un ejemplo de SortedMap, lo que significa que el orden de las claves se puede ordenar, y al iterar sobre las teclas, puede esperar que estén en orden.

HashMap por el contrario, no ofrece dicha garantía. Por lo tanto, cuando se itera sobre las teclas de un HashMap, no se puede estar seguro de qué orden van a estar en.

HashMap será más eficiente en general, por lo que utilizarlo siempre que no se preocupan por el orden de la llaves.

+116

'HashMap' es más eficiente en términos de tiempo. Un 'TreeMap' es más eficiente en el uso del espacio. – erickson

+30

TreeMap solo funciona con objetos Comparables, HashMap solo funciona con objetos con una implementación adecuada de hashCode(). – Thilo

+11

@erickson: ¿podría publicar una referencia/enlace para hacer una copia de seguridad de esta declaración? –

20

Utilice HashMap la mayoría de las veces, pero use TreeMap cuando necesite la clave que se va a ordenar (cuando necesite repetir las teclas).

7

Casi siempre usa HashMap, solo debe usar TreeMap si necesita que sus llaves estén en un orden específico.

7

HashMap se utiliza para la búsqueda rápida, mientras que TreeMap se utiliza para las iteraciones ordenadas sobre el mapa.

29

En resumen:

  • HashMap: Estructura de búsqueda-matriz, basado en hashCode(), es igual a implementaciones(), O (1) la complejidad de ejecución para la inserción y búsqueda, sin ordenar
  • TreeMap: Árbol estructura, basada en compareTo (aplicación), O (log (n)) la complejidad de ejecución para la inserción y búsqueda, ordenadas

Tomado de: HashMap vs. TreeMap

+2

La complejidad de un HashMap es O (1 + a). Dependiendo de la función hashCode "a" puede llegar a "n" en el peor de los casos. – 30thh

5

Alo ng con almacenamiento de clave ordenado, otra diferencia es con TreeMap, el desarrollador puede dar (String.CASE_INSENSITIVE_ORDER) con las claves de cadena, por lo que el comparador ignora el caso de la clave al realizar la comparación de las teclas en el acceso al mapa. No es posible dar esa opción con HashMap, siempre es una comparación sensible a mayúsculas y minúsculas en HashMap.

+1

No es necesario. Si realmente quiere esto, puede simplemente hacer un decorador para un mapa, para lo cual, para todo lo relacionado con la entrada clave, lo hace todo en mayúscula/minúscula y delegue en el mapa decorado. Al hacerlo, no es tan difícil tener un hashmap "insensible a mayúsculas y minúsculas". De todos modos, esta respuesta probablemente esté un poco fuera de tema: solo estás hablando de un caso de uso muy específico de treemap, para el cual no veo que sea muy significativo como una comparación entre hashmap/treemap –

14

voy a hablar de la HashMap y TreeMap aplicación en Java:

  • HashMap - aplicar interfaz del mapa básico

    1. implementado por una serie de cubos, cada cubeta es un LinkedList de entradas
    2. tiempo de ejecución de las operaciones básicas: put(), O medio (1), peor caso O (n), ocurre cuando la tabla es r esized; get(), remove(), promedio O (1)
    3. no sincronizado, para sincronizarlo: Map m = Collections.synchronizedMap(new HashMap(...));
    4. El orden de iteración del mapa es impredecible.
  • TreeMap - aplicar mapa de interfaz navegable

    1. implementado por un árbol rojo-negro
    2. momento de ejecutar operaciones básicas: put(), get(), remove(), peor de los casos O (lgn)
    3. no sincronizado, para sincronizarlo: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
    4. proporcionar la iteración ordenada. upperKey(), lowerKey() se puede utilizar para obtener el sucesor y el predecesor de una clave determinada.

En resumen, la mayor diferencia entre HashMap y TreeMap es que TreeMap implementa NavigableMap<K,V>, que proporcionan la función de repetición ordenada. Además, tanto HashMap como TreeMap son miembros del framework Java Collection. Puede investigar el source code of Java para saber más sobre sus implementaciones.

50

HashMap es implementado por Hash Table, mientras que TreeMap se implementa por Red-Black tree. La diferencia principal entre HashMap y TreeMap refleja la diferencia principal entre Hash y Binary Tree, es decir, al iterar, la garantía de TreeMap puede el orden de clave que se determina mediante el método compareTo() de un elemento o un conjunto de comparación en el constructor de TreeMap.

Eche un vistazo a following diagram.

enter image description here

Cuestiones relacionadas