¿Diferencia entre HashSet y HashMap?


168

Además del hecho de que HashSetno permite valores duplicados, ¿cuál es la diferencia entre HashMapy HashSet?

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


HashSet se implementa usando HashMap
2015

Creo que saber por qué HashSet es diferente a ArrayList lo ayudará a comprender la respuesta a su pregunta anterior: stackoverflow.com/questions/18706870/…
djangofan

Respuestas:


150

Son construcciones completamente diferentes. A HashMapes una implementación de Map. Un mapa asigna claves a valores. La búsqueda de claves se produce utilizando el hash.

Por otro lado, a HashSetes una implementación de Set. Un conjunto está diseñado para coincidir con el modelo matemático de un conjunto. A HashSetusa a HashMappara respaldar su implementación, como usted señaló. Sin embargo, implementa una interfaz completamente diferente.

Cuando esté buscando lo mejor Collectionpara sus propósitos, este Tutorial es un buen punto de partida. Si realmente quieres saber qué está pasando, también hay un libro para eso .


Esa afirmación es un poco simplista. Hay algo más debajo de las cubiertas, "" Devuelve un valor hash para el objeto especificado. Además del propio código hash del objeto, este método aplica una "función hash suplementaria", que defiende contra las funciones hash de baja calidad. Esto es crítico porque HashMap utiliza tablas hash de potencia de dos longitudes ". Weblogs.java.net/blog/2005/06/18/hashmap-implementation ; sin embargo, si mira el documento verá que este hash distribuye cosas sobre "cubos", así que al final creo que dos cosas pueden quedar asignada el mismo cubo.
justkt

1
Para responder a su segunda pregunta, no. Un mapa es si lo desea (clave -> valor) según lo definido por la excelente respuesta de @Bruno Rothgiesser. Un conjunto es para elementos no duplicados. Si desea duplicados y no clave-> valor, verificaría una implementación java.util.List. Consulte el tutorial de la Colección para obtener una guía definitiva: java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk: sí, puede obtener dos claves en un cubo, y luego se usa equals () para distinguir entre ellas. Por eso es esencial que hashCode () y equals () sean compatibles.
Michael Borgwardt

66
@SpikETidE: ni HashMap ni HashSet permiten duplicados. Ese es todo el punto.
Michael Borgwardt

23
@SpikETidE: un conjunto no tiene pares clave / valor, solo elementos. Y HashSet se implementa al tener un HashMap con los elementos establecidos como claves y el valor que se ignora.
Michael Borgwardt

300

HashSet es un conjunto , por ejemplo, {1,2,3,4,5}

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

Observe en mi ejemplo anterior que en el HashMap no debe haber claves duplicadas, pero puede tener valores duplicados.

En el HashSet, no debe haber elementos duplicados.


Pero la razón (más interesante) de 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 debe 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.
Andrew Marshall

65

HashSet

  1. La clase HashSet implementa la interfaz Set
  2. En HashSet, almacenamos objetos (elementos o valores), por ejemplo, si tenemos un HashSet de elementos de cadena, podría representar un conjunto de elementos HashSet: {"Hola", "Hola", "Adiós", "Ejecutar"}
  3. HashSet no permite elementos duplicados, lo que significa que no puede almacenar valores duplicados en HashSet.
  4. HashSet permite tener un único valor nulo.
  5. HashSet no está sincronizado, lo que significa que no son adecuados para operaciones seguras con subprocesos hasta que se sincronicen explícitamente. [Similitud]

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

HashMap

  1. La clase HashMap implementa la interfaz Map
  2. HashMap se utiliza para almacenar pares clave y valor. En resumen, mantiene la asignación de clave y valor (la clase HashMap es más o menos equivalente a Hashtable, excepto que no está sincronizada y permite valores nulos). Así es como podría representar elementos HashMap si tiene una clave entera y un valor de tipo String: por ejemplo, {1 -> "Hola", 2 -> "Hola", 3 -> "Adiós", 4 -> "Ejecutar"}
  3. HashMap no permite claves duplicadas, sin embargo, permite tener valores duplicados.
  4. HashMap permite una clave nula única y cualquier número de valores nulos.
  5. HashMap no está sincronizado, lo que significa que no son adecuados para operaciones seguras de subprocesos hasta que se sincronicen explícitamente. [Similitud]

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

Consulte este artículo para obtener más información.


36

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

No te confundas con sus nombres; Son cosas profundamente diferentes.


@HiteshSahu Ambos están implementados con Hash Tables ( en.wikipedia.org/wiki/Hash_table ). Esta es una buena estructura de datos para representar un conjunto, eficiente en las formas correctas y, esencialmente, las claves de un HashMap se implementan como un HashSet. Así que quien los nombró tuvo problemas para implementarlos y se centró en la implementación en lugar de su propósito (supongo).
Carl Manaster

1
Bien explicado. Gracias.
user3932000

5

El Hashsetinternamente implementa HashMap. Si ve la implementación interna , los valores insertados en HashSet se almacenan como claves en HashMap y el valor es un objeto ficticio de la clase Object.
La diferencia entre HashMap y HashSet es: -

  1. HashMap contiene pares de valores clave y se puede acceder a cada valor mediante la clave, ya que HashSet debe repetirse cada vez que no hay un método get.
  2. HashMapimplementa la interfaz Map y permite un valor nulo como clave y múltiples valores nulos como valores. Donde HashSetimplementa la interfaz Set, solo permite un valor nulo y ningún valor duplicado. ya que HashSet implementa HashMap internamente).
  3. HashSety HashMapno mantiene el orden de inserción mientras itera.

3

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


2

Como los nombres implican, un HashMap es un mapa asociativo (asignación de una clave a un valor), un HashSet es solo un conjunto .


2
@SpikETidE Ese es un detalle de cómo se implementa la unicidad, pero el significado de HashSet es implementar un conjunto.
Michael Borgwardt

1
entonces ... todo se reduce a "si no quieres duplicados usa hashSet ... Si no te molestas en duplicados usa HashMap" ...?
SpikETidE

3
Java no implementa una clase específica para una "colección con elementos potencialmente duplicados" (una "bolsa"), puede usar una Lista para esto (aunque una Lista agrega algo semántico a la bolsa: orden; pero puede ignorar esto).
leonbloy

2

Diferencias entre HashSet y HashMap en Java

1) La primera diferencia más significativa entre HashMap y HashSet es que HashMap es una implementación de la interfaz de Mapa, 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 unicidad al no permitir duplicados. reality HashSet es un contenedor alrededor de HashMap en Java, si observa 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 está poniendo Object en el mapa como clave y valor es un objeto final PRESENT que es ficticio.

2) La segunda diferencia entre HashMap y HashSet es que, utilizamos el método add () para colocar elementos en Set, pero utilizamos el método put () para insertar clave y valor en HashMap en Java.

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

Todo eso está en la diferencia entre HashSet y HashMap en Java. En resumen, HashSet y HashMap son dos tipos diferentes de Colección, uno es Set y otro Map.


2

Diferencias entre HashSet y HashMap en Java

HashSet utiliza internamente HashMap para almacenar objetos. Cuando el método add (String) lo llama, llama al método put (key, value) HahsMap donde key = String object & value = new Object (Dummy) .por lo tanto, no mantiene duplicados porque las teclas no son más que Value Objeto.

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

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


1

Una HashMapes agregar, obtener, eliminar, ... objetos indexados por una clave personalizada de cualquier tipo.
A HashSetes agregar elementos, eliminar elementos y verificar si hay elementos presentes comparando sus hashes.

Entonces, un HashMap contiene los elementos y un HashSet recuerda sus hashes.


1
Al comparar sus hashes y llamar a sus equals()métodos.
Marqués de Lorne

1

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

El uso de HashSet y HashMap con respecto a la base de datos lo ayudaría a comprender la importancia de cada uno.
HashSet: generalmente se usa para almacenar objetos de colección únicos. Por ejemplo: podría usarse como clase de implementación para almacenar relaciones de muchos a uno entre el
artículo de clase y la oferta de clase donde (el artículo tiene muchas ofertas) HashMap: se usa para asignar una clave al valor. El valor puede ser nulo o cualquier objeto / lista de objetos (que es un objeto en sí mismo).



0

Un HashSet usa 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 combinan en el mismo depósito. No recuerdo qué utiliza el HashMap interno para almacenar sus valores, pero realmente no importa, ya que ese contenedor interno nunca contendrá valores duplicados.

EDITAR : 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 Set . Los valores de HashMap son un Objeto que simplemente se almacena en los depósitos de HashMap.


Eso no está bien. Los elementos establecidos se usan directamente como claves HashMap.
Matthew Flaschen

0

HashMapes una Mapimplementación que permite valores duplicados pero no claves duplicadas. . Para agregar un objeto se requiere un par clave / valor. Se permiten claves nulas y valores nulos. p.ej:

{The-> 3, world-> 5, is-> 2, nice-> 4}

HashSetes una Setimplementación que no permite duplicados . Si intentó agregar un objeto duplicado, una llamada al public boolean add(Object o)método, el conjunto permanece sin cambios y regresa false. p.ej:

[El mundo es agradable]


-1

prácticamente respondiste tu 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 un código personalizado para hacerlo de manera más eficiente.


1
@oedo: java.util.HashSetdice que está respaldado por a java.util.HashMap.
justkt

2
No permitir duplicados no es una diferencia entre ellos.
Marqués de Lorne

-1

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


La clave es el valor en un HashSet.
Marqués de Lorne

-1

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


Si eso fuera cierto, HashSet no podría almacenar múltiples objetos con el mismo hashCode, y lo hace.
Marqués de Lorne

-1

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

Hashtables no permiten claves nulas y están sincronizadas.


No preguntó sobre Hashtables. No responde la pregunta.
Marqués de Lorne

-2

HashMap es una implementación de la interfaz de mapa HashSet es una implementación de Set Interface

HashMap Almacena datos en forma de pares de valores clave HashSet Almacena solo objetos

El método Put se usa para agregar elementos en el mapa El método Add se usa para agregar elementos es Set

En el mapa hash, el valor del código hash se calcula usando un objeto clave. Aquí, el objeto miembro se usa para calcular el valor del código hash, que puede ser el mismo para dos objetos, por lo que 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 porque se usa una clave única para acceder al objeto HashSet es más lento que Hashmap


1
Tienen un rendimiento esencialmente idéntico y "porque se usa una clave única" es incorrecto.
Marqués de Lorne
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.