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).
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)
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 ()).
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
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).
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.
Respuestas:
A
Set
representa un "conjunto de valores" genérico. ATreeSet
es un conjunto donde los elementos están ordenados (y por tanto ordenados), aHashSet
es un conjunto donde los elementos no están ordenados ni ordenados.HashSet
Normalmente, A es mucho más rápido que aTreeSet
.A
TreeSet
se 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'sTreeSet
), mientras que a seHashSet
usaObject.hashCode()
para crear un índice en una matriz. El tiempo de acceso para un árbol rojo-negro esO(log(n))
mientras que el tiempo de acceso para unHashSet
rango de tiempo constante al peor de los casos (cada elemento tiene el mismo hashCode) donde puede tener un tiempo de búsqueda linealO(n)
.fuente
El
HashSet
es una implementación de unSet
.fuente
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 ()).
fuente
Conjunto es una colección que no contiene elementos duplicados. Set es una interfaz.
HashSet implementa la
Set
interfaz, respaldada por una tabla hash (en realidad unaHashMap
instancia).Dado que
HashSet
es una de las implementaciones específicas deSet
interface.A
Set
puede ser cualquiera de los siguientes, ya que fue implementado por las siguientes clasesConcurrentSkipListSet : 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 unComparator
proporcionado 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
HashSet
puede ser soloLinkedHashSet
desdeLinkedHashSet
subclasesHashSet
fuente
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).
fuente
Set es una interfaz principal de todas las clases establecidas como TreeSet, LinkedHashSet, etc.
HashSet es una clase que implementa la interfaz Set.
fuente
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.
fuente
**
** 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.
**
**
Puede usar un valor NULL (ya que no se permite duplicar), los datos se almacenan aleatoriamente ya que no mantienen la secuencia
fuente