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?
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?
Respuestas:
A Set
representa un "conjunto de valores" genérico. A TreeSet
es un conjunto donde los elementos están ordenados (y por tanto ordenados), a HashSet
es un conjunto donde los elementos no están ordenados ni ordenados.
HashSet
Normalmente, A es mucho más rápido que a TreeSet
.
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's TreeSet
), mientras que a se HashSet
usa 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 HashSet
rango 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)
.
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 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 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 Comparator
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 solo LinkedHashSet
desde LinkedHashSet
subclasesHashSet
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.
**
** 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