En realidad, no es solo HashSet
. Todas las implementaciones de la interfaz Set
en Java 6 se basan en un Map
subyacente. Esto no es un requisito; es solo la forma en que la implementación es. Puede verlo usted mismo revisando la documentación de las diversas implementaciones de Set
.
Sus principales preguntas son
Pero, ¿por qué todavía se utilizan? ¿Existe alguna razón para usar además de hacer que sea más fácil de mantener los códigos?
Supongo que el mantenimiento del código es un gran factor de motivación. Por lo tanto, evita la duplicación y la hinchazón.
Set
y Map
son interfaces similares, en que los elementos duplicados no están permitidos. (Creo que la única Set
no respaldado por una Map
es CopyOnWriteArraySet
, que es una colección inusual, porque es inmutable.)
Específicamente:
Desde el documentation of Set
:
Una colección que no contiene elementos duplicados. Más formalmente, los conjuntos no contienen ningún par de elementos e1 y e2 tal que e1.equals (e2), y en la mayoría de un elemento nulo. Según lo implícito en su nombre, esta interfaz modela la abstracción del conjunto matemático .
La interfaz Conjunto coloca estipulaciones adicionales, más allá de las heredadas desde la interfaz de la recogida en el contratos de todos los constructores y en los contratos del complemento, es igual y métodos hashCode. Las declaraciones para otros métodos heredados también son incluidos aquí para mayor comodidad. (Los especificaciones que acompañan a estas declaraciones se han adaptado a la interfaz Set, pero que no contienen las estipulaciones adicionales.)
La estipulación adicional sobre constructores se ofrecen, como es lógico, que todos los constructores deben crear una conjunto que no contiene elementos duplicados (como se define anteriormente).
Y desde Map
:
Un objeto que se asigna a los valores claves. Un mapa no puede contener claves duplicadas; cada tecla se puede asignar a un máximo de un valor.
Si se puede poner en práctica sus Set
s utilizando el código existente, ningún beneficio (velocidad, por ejemplo), puede darse cuenta de código existente se acumula a su Set
también.
Si elige implementar un Set
sin un respaldo Map
, debe duplicar el código diseñado para evitar la duplicación de elementos. Ah, la deliciosa ironía.
Dicho esto, no hay nada que le impida implementar su Set
de manera diferente.
@yuku: el nivel de residuos en las colecciones de Java por defecto se mindboggling. Los peores delincuentes ocurren cuando manipulas primitivos. ¿Crees que un HashSet
@yuku: para continuar en mi comentario ... Lo que quiero decir es: o bien perfs y memoria importan y luego tienes que encontrar una alternativa porque el nivel de desperdicio en las colecciones predeterminadas de Java es demasiado alto o no necesitas Las perforaciones y la memoria no importan, ya que utilizará una pequeña cantidad de elementos y las colecciones predeterminadas de Java son correctas (es probable que haya una mejor alternativa como las colecciones de Google, etc.) – SyntaxT3rr0r
@WizardOfOdds: son muchas afirmaciones audaces con poca evidencia para respaldarlos. – skaffman