2011-08-10 12 views
18

Sono molto confuso dai tipi di Scala HashSet e Set in quanto entrambi sembrano fare la stessa cosa.La differenza tra "HashSet" e "Set" in Scala?

  • Qual è la differenza tra loro?
  • È lo stesso in Java?
  • Nel mio riferimento si dice che HashSet è una "classe set esplicito" (rispetto a Set). Cosa significa?
+0

vedere anche [un'altra versione di questa domanda] (http://stackoverflow.com/questions/18759913/what-is-the-difference-between-hashset-and-set-and-when-should-each-one), così come una domanda simile per ['Map' vs' HashMap'] (http://stackoverflow.com/questions/31685236/scala-map-vs-hashmap) – EthanP

risposta

32

Le implementazioni di Scala HashSet modificabili e immutabili sono lezioni concrete che è possibile creare. Ad esempio, se chiedi esplicitamente un nuovo scala.collection.immutable.HashSet, otterrai sempre un set che è implementato da un trie di hash. Esistono altre implementazioni, come ListSet, che utilizza un elenco.

Set è un trait esteso a tutte le implementazioni impostate (mentre in Java, Set è un'interfaccia).

Set è anche un oggetto associato * con un metodo apply **. Quando chiami Set(...), stai chiamando questo metodo di produzione e ottieni un valore di ritorno che è una specie di Set. Potrebbe essere un HashSet, ma potrebbe essere un'altra implementazione. Secondo 2, l'implementazione predefinita per un set immutabile ha una rappresentazione speciale per il set vuoto e imposta la dimensione fino a 4. I set immutabili di taglia 5 e superiori e i set mutabili utilizzano tutti hashSet.


* In Scala, invece di avere metodi di classe statico, è possibile creare un Singleton object con lo stesso nome di tua classe o un tratto. Questo è chiamato oggetto complementare e i metodi definiti su di esso possono essere chiamati come ObjectName.method(), in modo simile a come si chiamerebbe un metodo statico in Java.

** Set(x) è zucchero sintattico per Set.apply(x).

+3

'Potrebbe essere un HashSet, ma potrebbe essere qualche altra implementazione. - ma su quali fattori dipende il tipo di set impostato? Prima di pensare all'implementazione predefinita di 'Set' c'è' HashSet', per 'IndexedSeq' - Vector e così via .. – MyTitle

Problemi correlati