¿Cuál es la diferencia entre HashSet y Set?

83

Vi el fragmento de código como

Set<Record> instances = new HashSet<Record>();

Me pregunto si Hashset es un tipo especial de set. ¿Alguna diferencia entre ellos?

user496949
fuente
8
Es posible que desee comprobar el concepto de interfaces
Nikita Rybak

Respuestas:

101

A Setrepresenta un "conjunto de valores" genérico. A TreeSetes un conjunto donde los elementos están ordenados (y por tanto ordenados), a HashSetes un conjunto donde los elementos no están ordenados ni ordenados.

HashSetNormalmente, A es mucho más rápido que a TreeSet.

A TreeSetse implementa típicamente como un árbol rojo-negro (Ver http://en.wikipedia.org/wiki/Red-black_tree - No he validado la implementación real de sun / oracle's TreeSet), mientras que a se HashSetusa Object.hashCode()para crear un índice en una matriz. El tiempo de acceso para un árbol rojo-negro es O(log(n))mientras que el tiempo de acceso para un HashSetrango de tiempo constante al peor de los casos (cada elemento tiene el mismo hashCode) donde puede tener un tiempo de búsqueda lineal O(n).

Erik
fuente
Además, existen estas implementaciones de propósito general: LinkedHashSet (una variante de HashSet que conserva cierto orden para el Iterador), ConcurrentSkipListSet (una implementación de SortedSet guardada en subprocesos), CopyOnWriteArraySet (una variante segura para subprocesos optimizada para "muchas lecturas, muy rara vez escribe "), EnumSet (que solo funciona con tipos de enumeración para los elementos, pero luego es incluso más rápido que HashSet).
Paŭlo Ebermann
7
@Erik: Solicito editar tu respuesta. TreeSet no está ordenado. HashSet = no ordenado, TreeSet = ordenado, LinkedHashSet = ordenado. Modifique su respuesta en consecuencia
Rais Alam
Hashset puede ser más lento si la implementación de hashCode es mala (por ejemplo, siempre devuelve el mismo hashcode)
Romain Hautefeuille
35

El HashSetes una implementación de un Set.

Vaugham
fuente
14
No entiendo este comentario. La pregunta es "cuál es la diferencia" y no "cuál es la relación entre".
jambox
8
Explicó la diferencia, Set es la interfaz, HashSet es la implementación de esa interfaz. Por lo tanto, no son implementaciones diferentes, simplemente HashSet es una de las implementaciones de Set (la otra implementación es TreeSet).
AggieDev
suena como una respuesta válida para mí
Romain Hautefeuille
3
Te dejó un voto negativo porque no respondiste la pregunta en absoluto. En el futuro, le recomiendo que agregue documentación, ejemplos y comparaciones. Simplemente escribiendo una sola oración, y la mayor parte del contenido son solo enlaces a otros lugares, NO es la forma en que responde las preguntas en Stack Overflow.
Urda
Esta pregunta ha sido respondida, hace 6 años, (ver arriba) pero gracias.
vaugham
16

La pregunta ha sido respondida, pero no he visto la respuesta de por qué el código menciona ambos tipos en el mismo código.

Normalmente, desea codificar contra interfaces que en este caso es Set. ¿Por qué? Porque si siempre hace referencia a su objeto a través de interfaces (excepto el nuevo HashSet ()), entonces es trivial cambiar la implementación del objeto más adelante si encuentra que sería mejor hacerlo porque solo lo ha mencionado una vez en su código base (donde hizo new HashSet ()).

MeBigFatGuy
fuente
14

Conjunto es una colección que no contiene elementos duplicados. Set es una interfaz.

HashSet implementa la Setinterfaz, respaldada por una tabla hash (en realidad unaHashMap instancia).

Dado que HashSetes una de las implementaciones específicas deSet interface.

A Setpuede ser cualquiera de los siguientes, ya que fue implementado por las siguientes clases

ConcurrentSkipListSet : una implementación de NavigableSet concurrente escalable basada en un ConcurrentSkipListMap. Los elementos del conjunto se mantienen ordenados de acuerdo con su orden natural, o por un Comparatorproporcionado en el momento de creación del conjunto, dependiendo del constructor que se utilice.

CopyOnWriteArraySet : un conjunto que utiliza una CopyOnWriteArrayList interna para todas sus operaciones.

EnumSet : una implementación de Set especializada para usar con tipos de enumeración. Todos los elementos de un conjunto de enumeración deben provenir de un solo tipo de enumeración que se especifica, explícita o implícitamente, cuando se crea el conjunto.

TreeSet : una implementación de NavigableSet basada en un TreeMap. Los elementos se ordenan utilizando su orden natural, o mediante un Comparador proporcionado en el momento de la creación del conjunto, según el constructor que se utilice.

LinkedHashSet : implementación de tabla ash y lista vinculada de la interfaz Set, con orden de iteración predecible. Esta implementación se diferencia de HashSet en que mantiene una lista doblemente enlazada que se ejecuta en todas sus entradas.

Pero HashSetpuede ser solo LinkedHashSetdesde LinkedHashSetsubclasesHashSet

Ravindra babu
fuente
8

Set es la interfaz general para una colección similar a un set, mientras que HashSet es una implementación específica de la interfaz Set (que usa códigos hash, de ahí el nombre).

gmw
fuente
2

Set es una interfaz principal de todas las clases establecidas como TreeSet, LinkedHashSet, etc.

HashSet es una clase que implementa la interfaz Set.

unk1102
fuente
0

HashSet es una clase derivada de la interfaz Set. Como clase derivada de Set, HashSet obtiene las propiedades de Set. Las clases derivadas importantes y más utilizadas de Set son HashSet y TreeSet.

Hemlata Gehlot
fuente
-1

**

  • Conjunto:

** Es una interfaz que es un subtipo de interfaz de colección, al igual que LIST y QUEUE.

El conjunto tiene menos de 3 subclases, se usa para almacenar múltiples objetos sin duplicados.

  1. HashSet
  2. LinkedHashSet
  3. TreeSet (que implementa la interfaz SortedSet)

**

  • HashSet:

**

Puede usar un valor NULL (ya que no se permite duplicar), los datos se almacenan aleatoriamente ya que no mantienen la secuencia

Usuario anónimo
fuente