2011-08-10 8 views
18

Estoy muy confundido por los tipos HashSet y Set de Scala ya que ambos parecen hacer lo mismo.¿La diferencia entre 'HashSet' y 'Set' en Scala?

  • ¿Cuál es la diferencia entre ellos?
  • ¿Es lo mismo en Java?
  • En mi referencia, dice que HashSet es una "clase de conjunto explícita" (en comparación con Set). Qué significa eso?
+0

vea también [otra versión de esta pregunta] (http://stackoverflow.com/questions/18759913/what-is-the-difference-between-hashset-and-set-and-when-should-each-one), así como una pregunta similar para ['Map' vs' HashMap'] (http://stackoverflow.com/questions/31685236/scala-map-vs-hashmap) – EthanP

Respuesta

32

Las implementaciones cambiables e inmutables de Scala HashSet son clases concretas que puede crear instancias. Por ejemplo, si solicita explícitamente un nuevo scala.collection.immutable.HashSet, siempre obtendrá un conjunto implementado por un hash trie. Existen otras implementaciones configuradas, como ListSet, que usa una lista.

Set es un trait que extiende todas las implementaciones del conjunto (mientras que en Java, Set es una interfaz).

Set es también un objeto complementario * con un método apply **. Cuando llamas al Set(...), llamas a este método de fábrica y obtienes un valor de retorno que es de algún tipo de Set. Podría ser un HashSet, pero podría ser alguna otra implementación. De acuerdo con 2, la implementación predeterminada para un conjunto inmutable tiene una representación especial para el conjunto vacío y establece el tamaño hasta 4. Los conjuntos inmutables de tamaño 5 y superiores y los conjuntos mutables usan todos hashSet.


* En Scala, en lugar de tener métodos estáticos de clase, puede crear un producto único object con el mismo nombre que su clase o rasgo. Esto se denomina objeto complementario, y los métodos que defina en él se pueden llamar como ObjectName.method(), de forma similar a cómo llamaría a un método estático en Java.

** Set(x) es azúcar sintáctica para Set.apply(x).

+3

'Podría ser un HashSet, pero podría ser alguna otra implementación. ¿Pero de qué factores depende el tipo devuelto de Set? Antes de pensar para la implementación predeterminada de 'Set 'es' HashSet', para 'IndexedSeq' - Vector y así sucesivamente .. – MyTitle

Cuestiones relacionadas