Considere el siguiente código:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()dará 1 ya HashSetque 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 HashMapel mismo caso?
java
hashmap
duplicates
hashset
Anand
fuente
fuente

HashMappara ver sikeyya existe antes de llamarputal 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.HashSetser 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
HashSetactúa como aSet, lo que significa que agrega su objeto directamenteHashSety no puede contener duplicados. Simplemente agrega tu valor directamenteHashSet.Sin embargo,
HashMapes unMaptipo. Eso significa que cada vez que agrega una entrada, agrega un par clave-valor.En
HashMappuede tener valores duplicados, pero no claves duplicadas. EnHashMapla nueva entrada se reemplazará la anterior. La entrada más reciente estará en elHashMap.Comprender el enlace entre HashMap y HashSet:
Recuerde,
HashMapno puede tener claves duplicadas. Detrás de la escenaHashSetusa aHashMap.Cuando intentas agregar cualquier objeto a
HashSet, esta entrada se almacena realmente como una clave enHashMapel mismo,HashMapque se usa detrás de escenaHashSet. Dado que este subyacenteHashMapnecesita 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 laHashMapmentira debajo. Sin embargo,HashMapno admite duplicados. Por lo tanto,HashSetseguirá 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:
HashMappermite duplicarvalues, pero nokeys.HashSetno puede contener duplicados.Para jugar si la adición de un objeto se completó con éxito o no, puede verificar el
booleanvalor devuelto cuando llama.add()y ver si regresatrueofalse. Si regresótrue, se insertó.fuente
HashMap allows duplicate valuesHashMap reemplaza el valor anterior por el nuevo.Los documentos son bastante claros en esto:
HashSet.addno reemplaza:Pero va a sustituir:
HashMap.putfuente
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
HashMapbásicamente contiene loEntryque posteriormente contieneKey(Object)y.Value(Object)InternamenteHashSetsonHashMapyHashMapreemplazan los valores como algunos de ustedes ya señalaron ... pero ¿realmente reemplaza las claves? No ... y ese es el truco aquí.HashMapmantiene su valor como clave en el subyacenteHashMapy 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