2010-05-05 49 views
120

Aparte del hecho de que HashSet no permite valores duplicados, ¿cuál es la diferencia entre HashMap y Hashset?Diferencia entre HashSet y HashMap?

Me refiero a la implementación sabia? Es un poco vago porque ambos usan tablas de hash para almacenar valores.

+0

HashSet se implementa utilizando HashMap – therealprashant

+0

Creo que saber por qué HashSet es diferente de ArrayList le ayudará a comprender la respuesta a su pregunta anterior: https://stackoverflow.com/questions/18706870/java-hashset-vs-array-performance – djangofan

Respuesta

112

Son construcciones completamente diferentes. A HashMap es una implementación de Map. A Map asigna claves a los valores. La búsqueda clave se produce con el hash.

Por otro lado, un HashSet es una implementación de Set. Un Set está diseñado para coincidir con el modelo matemático de un conjunto. Un HashSet utiliza un HashMap para respaldar su implementación, como ha indicado. Sin embargo, implementa una interfaz completamente diferente.

Cuando está buscando lo que será el mejor Collection para sus propósitos, este Tutorial es un buen lugar para comenzar. Si realmente quieres saber qué está pasando, there's a book for that, también.

+0

La búsqueda de la clave se produce con el hash ..... Entonces, ¿puede haber un código hash asignado a más de una clave ...? – SpikETidE

+1

así que ... todo se reduce a "si no quieres duplicados usa hashSet ... Si no te molestas con los duplicados usa HashMap" ...? – SpikETidE

+0

Esa afirmación es un tanto simplista. Hay algo más que sucede bajo las sábanas "," Devuelve un valor hash para el objeto especificado. Además de el propio hashCode del objeto, este método aplica una "función hash suplementaria ", que defiende contra _poor_ funciones hash de calidad. Esto es crítico porque HashMap usa power-of dos tablas de hash de longitud. "Http://weblogs.java.net/blog/2005/06/18/hashmap-implementation - sin embargo, si miras el documento, podrás veo que este hash distribuye cosas sobre "cubos", así que al final creo que dos cosas pueden ser mapeadas en el mismo cubo. – justkt

0

A HashSet se implementa en términos de HashMap. Es un mapeo entre la clave y un objeto PRESENTE.

+2

¿Qué es un "objeto PRESENTE"? – EJP

0

prácticamente ha respondido su propia pregunta - hashset no permite valores duplicados. sería trivial construir un hashset usando un hashmap de respaldo (y solo una comprobación para ver si el valor ya existe). Supongo que las diversas implementaciones de java hacen eso o implementan algún código personalizado para hacerlo de manera más eficiente.

+1

@oedo - 'java.util.HashSet' dice que está respaldado por' java.util.HashMap'. – justkt

+1

No permitir duplicados no es una diferencia entre ellos. – EJP

0

Un HashSet utiliza un HashMap internamente para almacenar sus entradas. Cada entrada en el HashMap interno está codificada por un solo Objeto, por lo que todas las entradas se mezclan en el mismo depósito. No recuerdo qué HashMap interno usa para almacenar sus valores, pero realmente no importa ya que ese contenedor interno nunca contendrá valores duplicados.

EDIT: Para abordar el comentario de Matthew, tiene razón; Lo tuve al revés. El HashMap interno está codificado con los objetos que componen los elementos de configuración. Los valores de HashMap son un Objeto que simplemente se almacena en los contenedores de HashMap.

+0

Eso no está bien. Los elementos establecidos se usan directamente como teclas HashMap. –

3

HashSet nos permite almacenar objetos en el conjunto donde HashMap nos permite almacenar objetos en función de la clave y el valor. Cada objeto u objeto almacenado tendrá clave.

2

Como su nombre indica, un HashMap es una asociativo Mapa (asignación de una clave a un valor), un HashSet es sólo un Establecer.

+0

Pero en hashSet un código hash se asigna a un valor .... – SpikETidE

+1

@SpikETidE Este es un detalle de cómo se implementa la singularidad, pero el significado de HashSet es implementar un conjunto. –

+0

así que ... todo se reduce a "si no quieres duplicados usa hashSet ... Si no te molestas con los duplicados usa HashMap" ....? – SpikETidE

252

HashSet es un conjunto, p. Ej. {1,2,3,4,5}

HashMap es un clave -> valor (clave de valor) mapa, por ejemplo, {a -> 1, b -> 2, c -> 2, d -> 1}

Observe en el ejemplo anterior que en el HashMap no debe ser duplicados de las llaves, pero puede tener valores duplicados.

En el HashSet, no debe haber elementos duplicados.

+25

Esta es la respuesta más clara de IMO. –

+0

Pero la razón (más interesante) para la confusión es que incluso en HashSet necesita una "clave" para acceder a los elementos. Es decir, los objetos, incluso en matemáticas, tienen nombres (o direcciones), si se quiere acceder o hacer referencia a ellos. Entonces, en este sentido real, un HashSet es un HashMap especialmente simple, con los nombres (o direcciones) de sus elementos. –

1

A HashMap es agregar, obtener, eliminar, ... objetos indexados por una clave personalizada de cualquier tipo.
A HashSet es agregar elementos, eliminar elementos y comprobar si hay elementos presentes comparando sus valores hash.

Así que un HashMap contiene los elementos y un HashSet recuerda sus valores hash.

+0

Comparando sus hashes y llamando a sus métodos 'equals()'. – EJP

1

Diferencias: con respecto a la jerarquía: HashSet implementa Set. HashMap implementa Map y almacena una asignación de claves y valores.

Un uso de HashSet y HashMap con respecto a la base de datos lo ayudará a comprender la importancia de cada uno.
HashSet: se usa generalmente para almacenar objetos de colección únicos. Ej: Podría ser utilizado como clase de implementación para el almacenamiento de muchos-a-uno nave de la relación entre
artículo clase y clase de la subasta, donde (artículo tiene muchas ofertas) HashMap: se utiliza para asignar una clave de valor. el valor puede ser nulo o cualquier Objeto/lista de Objeto (que es un objeto en sí mismo).

30

Es realmente una pena que sus nombres comiencen con Hash. Esa es la parte menos importante de ellos. Las piezas importantes vienen después del Hash - Set y Map, como han señalado otros. Lo que son, respectivamente, es un Conjunto - una colección desordenada - y un Mapa - una colección con acceso por clave. Resulta que se implementan con hashes, de ahí provienen los nombres, pero su esencia está oculta detrás de esa parte de sus nombres.

No se deje confundir por sus nombres; son cosas profundamente diferentes.

+0

Buena explicación, alguna idea sobre por qué su nombre comienza con hash? –

+0

@HiteshSahu Ambos se implementan con Hash Tables (https://en.wikipedia.org/wiki/Hash_table). Esta es una buena estructura de datos para representar un conjunto, eficiente de la manera correcta y, esencialmente, las claves de un HashMap se implementan como un HashSet. Entonces, quienquiera que los haya nombrado se tomó la molestia de implementarlos y se centró en la implementación más que en su propósito (supongo). –

-1

Básicamente en HashMap, el usuario debe proporcionar tanto la clave como el valor, mientras que en HashSet solo proporciona valor, la clave se deriva automáticamente del valor utilizando la función hash. Entonces, después de tener tanto la clave como el valor, HashSet puede almacenarse como HashMap internamente.

+0

La clave * es * el valor en un HashSet. – EJP

-1

HashSet y HashMap ambos pares de tiendas, la diferencia radica en que en HashMap puede especificar una clave, mientras que en HashSet la llave proviene de código hash del objeto

+0

Si eso fuera cierto, HashSet no podría almacenar múltiples objetos con el mismo hashCode, y lo hace. – EJP

0

Las diferencias entre HashSet y HashMap en Java

1) La primera y más significativa diferencia entre HashMap y HashSet es que HashMap es una implementación de la interfaz Map mientras que HashSet es una implementación de la interfaz Set, lo que significa que HashMap es una estructura de datos basada en valores clave y HashSet garantiza la exclusividad al no permitir duplicados. En realidad, HashSet es un wr apper alrededor de HashMap en Java, si nos fijamos en el código del método add (E e) de HashSet.java verá el siguiente código:

public boolean add(E e) 
{ 
    return map.put(e, PRESENT)==null; 
} 

donde su objeto poner en mapa como clave y el valor es un objeto presente final que es ficticia.

2) segunda diferencia entre HashMap y HashSet es que, utilizamos añadir() para poner elementos en conjunto, pero nosotros usamos método put() para insertar clave y el valor en HashMap en Java.

3) HashSet solo permite una clave nula, pero HashMap puede permitir una clave nula + múltiples valores nulos.

Todo depende de la diferencia entre HashSet y HashMap en Java. En resumen, HashSet y HashMap son dos tipos diferentes de colecciones: una es un conjunto y otra es un mapa.

-1

HashMaps permiten una clave nula y valores nulos. No están sincronizados, lo que aumenta la eficiencia. Si es necesario, puede sincronizarlos usando Collections.SynchronizedMap()

Hashtables no permiten llaves nulas y están sincronizados.

+0

No preguntó sobre Hashtables. No responde la pregunta. – EJP

1

Las diferencias entre HashSet y HashMap en Java

HashSet utiliza internamente HashMap para almacenar objects.when añadir (String) llamaron llama HahsMap poner método (clave, valor) donde key = objeto String & value = new Object (Dummy). Por lo tanto, no mantiene duplicados porque las claves no son más que Value Object.

Los objetos que se almacenan como clave en Hashset/HashMap deben anular el código hash & es igual a contrato.

Las claves que se usan para acceder/almacenar objetos de valor en HashMap deben declararse como finales porque cuando se modifica el objeto de valor no se puede ubicar & devuelve nulo.

0

HashSet

HashSet es la implementación de la Interfaz Se establece que no permite valores duplicados todos los métodos que están en marco de recopilación son también en Set interfaz por defecto, pero cuando estamos hablando de Hash establecen lo principal es los objetos que se van a almacenar en HashSet deben anular los métodos equals() y hashCode() para que podamos verificar la igualdad y no se almacenen valores duplicados en nuestro conjunto. Si hemos creado nuestros propios objetos, necesitamos implementar hashCode() e igual() de tal manera que será capaz de comparar los objetos correctamente cuando se almacenan en un conjunto para que los objetos duplicados no se almacenen, si no hemos anulado este método los objetos tomarán la implementación predeterminada de este método sobredosis.

Método: public boolean add (Object o) método se utiliza para agregar los elementos de un conjunto que devuelve false si se trata de un valor duplicado en caso de HashSet devuelve cierto si de otro modo agregado con éxito.

HashMap

HashMap es una aplicación de mapa de interfaz, que asigna una clave para llaves value.Duplicate no están permitidos en un mapa.Básicamente map Interface tiene dos clases de implementación HashMap y TreeMap, la diferencia principal es que TreeMap mantiene el orden de los objetos, pero HashMap no lo hará. HashMap permite valores nulos y claves nulas. HashMap no está sincronizado, pero collection framework proporciona métodos para que podamos sincronizarlos si múltiples hilos van a acceder a nuestro hashmap y un hilo es estructuralmente cambiar nuestro mapa.

Método público El método put (Object Key, Object value) se usa para agregar elementos en el mapa.

-1

HashMap es una implementación de la interfaz Map HashSet es una implementación del conjunto de interfaz

Tiendas HashMap datos en forma de valor de par de claves HashSet tienda sólo los objetos

método PUT se utiliza para agregar el elemento en el mapa método Add se utiliza para agregar elemento se establece

En hash de valor del mapa de código hash se calcula con objeto clave Aquí objeto miembro se utiliza para calcular el valor código hash que puede ser el mismo para t wo objects, el método equal() se usa para verificar la igualdad si devuelve falso, lo que significa que dos objetos son diferentes.

HashMap es más rápido que hashset debido clave única se utiliza para acceder objeto HashSet es más lento que Hashmap

+0

Tienen un rendimiento esencialmente idéntico, y 'porque se usa una clave única' es incorrecto. – EJP

33

HashSet

  1. clase HashSet implementa la interfaz Conjunto
  2. En HashSet, almacenamos objetos (elementos o valores) eg Si tenemos un HashSet de elementos de cadena, entonces podría representar un conjunto de elementos HashSet : {"Hola", "Hola", "Adiós", "Ejecutar"}
  3. HashSet no permite elementos duplicados que signifiquen pueden no almacena valores duplicados en HashSet.
  4. HashSet permite tener un único valor nulo.
  5. HashSet no está sincronizado que significa que no son adecuados para operaciones de hilo seguro hasta menos que esté sincronizada de forma explícita. [Similitud]

         add  contains next  notes 
    HashSet    O(1)  O(1)  O(h/n) h is the table 
    

HashMap

  1. clase HashMap implementa la interfaz del mapa
  2. HashMap es utilizado para almacenar claves & pares de valores. En definitiva, se mantiene la mapeo de valor clave & (La clase HashMap es más o menos equivalente a Hashtable, excepto que no está sincronizado y permite valores nulos.) Este es cómo se puede representar elementos HashMap si tiene clave entera valor y del tipo de cadena: por ejemplo {1 -> "Hola", 2 -> "Hola", 3 -> "Adiós", 4 -> "Ejecutar"}
  3. HashMap no permite las claves duplicadas, pero permite tener valores duplicados.
  4. HashMap permite una sola clave nula y cualquier cantidad de valores nulos.
  5. HashMap no está sincronizado que significa que no son adecuados para operaciones de hilo seguro hasta menos que esté sincronizada de forma explícita. [Similitud]

         get  containsKey next  Notes 
    HashMap    O(1)  O(1)  O(h/n) h is the table 
    

favor refiérase this article para encontrar más información.

0

HashMap es una aplicación Map, permitiendo valores duplicados pero no duplican llaves.. Para agregar un objeto, se requiere un par Clave/Valor. Se permiten claves nulas y valores nulos. por ejemplo:

{The-> 3, mundial> 5, es-> 2, agradable-> 4}

HashSet es una implementación Set, que hace no permite duplicados .Si Intentó agregar un objeto duplicado, una llamada al método public boolean add(Object o), luego el conjunto permanece sin cambios y devuelve false. por ejemplo:

[El, mundo, es, buen]

1

1) En primer lugar y la diferencia más significativa entre HashMap y HashSet es que HashMap es una implementación de la interfaz Map mientras HashSet es una implementación del Conjunto interfaz, lo que significa que HashMap es una estructura de datos basada en el valor clave y HashSet garantiza la singularidad al no permitir duplicados. En realidad, HashSet es un envoltorio alrededor de HashMap en Java, si nos fijamos en el código del método add (E e) de HashSet.java Verá el siguiente código:

public boolean add(E e) { 
    return map.put(e, PRESENT)==null; 
} 

donde poner Objeto en el mapa como clave y valor es un objeto final PRESENTE que es ficticio.

2) La segunda diferencia entre HashMap y HashSet es que utilizamos el método add() para poner elementos en Set pero utilizamos el método put() para insertar claves y valores en HashMap en Java.

3) HashSet solo permite una clave nula, pero HashMap puede permitir una clave nula + múltiples valores nulos.

Todo depende de la diferencia entre HashSet y HashMap en Java. En resumen, HashSet y HashMap son dos tipos diferentes de colecciones: una es un conjunto y otra es un mapa.

0

El Hashset implementa HashMap de forma interna. Si ve la implementación interna en http://javaconceptoftheday.com/how-hashset-works-internally-in-java/, los valores insertados en HashSet se almacenan como claves en el HashMap y el valor es un objeto ficticio de la clase Object. La diferencia entre HashMap vs HashSet es: - 1. HashMap contiene pares de valores clave y se puede acceder a cada valor por clave donde HashSet necesita repetirse cada vez ya que no hay método get. 2. HashSet implementa la interfaz Map y permite un valor nulo como clave y múltiples valores nulos como valores. Cuando HashSet implementa Set interface, solo permite un valor nulo y no hay valores duplicados. (Recuerde que una clave nula está permitida en la clave HashMap) un valor nulo en HashSet como HashSet implementa HashMap internamente). 3.HashSet y HashMap no mantienen el orden de inserción durante la iteración.