Considere el siguiente código:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
dará 1 ya HashSet
que no permite duplicados, por lo que solo se almacenará un elemento.
Quiero saber si agregamos el elemento duplicado, ¿entonces reemplaza el elemento anterior o simplemente no lo agrega?
Además, ¿qué pasará con HashMap
el mismo caso?
java
hashmap
duplicates
hashset
Anand
fuente
fuente
HashMap
para ver sikey
ya existe antes de llamarput
al respaldomap
?Set
, y eso nunca es reemplazado por laput()
operación.Set
, pero me di cuenta de queput()
solo anulará el valor, no la clave. En este caso, es el mismo valor puesto junto a la clave nuevamente, lo que puede o no ser mejor que verificar si la clave existe y poner. De cualquier manera, entiendo cómo funciona.HashSet
ser implementado en forma de aHashMap
. Sin embargo, es difícil saberlo, a menos que sea uno de los desarrolladores de las clases.Lo primero que debe saber es que
HashSet
actúa como aSet
, lo que significa que agrega su objeto directamenteHashSet
y no puede contener duplicados. Simplemente agrega tu valor directamenteHashSet
.Sin embargo,
HashMap
es unMap
tipo. Eso significa que cada vez que agrega una entrada, agrega un par clave-valor.En
HashMap
puede tener valores duplicados, pero no claves duplicadas. EnHashMap
la nueva entrada se reemplazará la anterior. La entrada más reciente estará en elHashMap
.Comprender el enlace entre HashMap y HashSet:
Recuerde,
HashMap
no puede tener claves duplicadas. Detrás de la escenaHashSet
usa aHashMap
.Cuando intentas agregar cualquier objeto a
HashSet
, esta entrada se almacena realmente como una clave enHashMap
el mismo,HashMap
que se usa detrás de escenaHashSet
. Dado que este subyacenteHashMap
necesita un par clave-valor, se genera un valor ficticio para nosotros.Ahora, cuando intente insertar otro objeto duplicado en el mismo
HashSet
, nuevamente intentará insertarlo como una clave en laHashMap
mentira debajo. Sin embargo,HashMap
no admite duplicados. Por lo tanto,HashSet
seguirá teniendo como resultado un solo valor de ese tipo. Como nota al margen, para cada clave duplicada, dado que el valor generado para nuestra entrada en HashSet es un valor aleatorio / ficticio, la clave no se reemplaza en absoluto. se ignorará como eliminar la clave y volver a agregar la misma clave (el valor ficticio es el mismo) no tendría ningún sentido.Resumen:
HashMap
permite duplicarvalues
, pero nokeys
.HashSet
no puede contener duplicados.Para jugar si la adición de un objeto se completó con éxito o no, puede verificar el
boolean
valor devuelto cuando llama.add()
y ver si regresatrue
ofalse
. Si regresótrue
, se insertó.fuente
HashMap allows duplicate values
HashMap reemplaza el valor anterior por el nuevo.Los documentos son bastante claros en esto:
HashSet.add
no reemplaza:Pero va a sustituir:
HashMap.put
fuente
En el caso de HashSet, NO lo reemplaza.
De los documentos:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )
"Agrega el elemento especificado a este conjunto si aún no está presente. Más formalmente, agrega el elemento especificado e a este conjunto si este conjunto no contiene ningún elemento e2 tal que (e == null? E2 == null: e.equals ( e2)). Si este conjunto ya contiene el elemento, la llamada deja el conjunto sin cambios y devuelve falso ".
fuente
Corrígeme si me equivoco, pero lo que entiendes es que con cadenas, "Hola" == "Hola" no siempre se hace realidad (porque no son necesariamente el mismo objeto).
Sin embargo, la razón por la que obtiene una respuesta de 1 es porque la JVM reutilizará los objetos de cadenas siempre que sea posible. En este caso, la JVM está reutilizando el objeto de cadena y, por lo tanto, sobrescribe el elemento en el Hashmap / Hashset.
Pero no tiene garantizado este comportamiento (porque podría ser un objeto de cadena diferente que tiene el mismo valor "Hola"). El comportamiento que ve es solo debido a la optimización de la JVM.
fuente
Primero debe verificar el método put en el mapa Hash, ya que HashSet está respaldado por HashMap
fuente
Para decirlo de otra manera: cuando inserta un par clave-valor en un HashMap donde la clave ya existe (en cierto sentido, hashvalue () da el mismo valor e igual () es cierto, pero los dos objetos aún pueden diferir de varias maneras ), la clave no se reemplaza pero se sobrescribe el valor. La clave solo se usa para obtener el valor hash () y encontrar el valor en la tabla con él. Dado que HashSet usa las claves de un HashMap y establece valores arbitrarios que realmente no importan (para el usuario) como resultado, los Elementos del conjunto tampoco se reemplazan.
fuente
HashMap
básicamente contiene loEntry
que posteriormente contieneKey(Object)
y.Value(Object)
InternamenteHashSet
sonHashMap
yHashMap
reemplazan los valores como algunos de ustedes ya señalaron ... pero ¿realmente reemplaza las claves? No ... y ese es el truco aquí.HashMap
mantiene su valor como clave en el subyacenteHashMap
y el valor es solo un objeto ficticio. Por lo tanto, si intenta reinsertar el mismo valor en HashMap (clave en el mapa subyacente), simplemente reemplaza el valor ficticio y no la clave (valor para HashSet).Mire el código a continuación para la clase HashSet:
Aquí e es el valor para HashSet pero la clave para el mapa subyacente. Y la clave nunca se reemplaza. Espero poder aclarar la confusión.
fuente