Questa è più una questione di stile e preferenza, ma qui va: quando dovrei usare scala.Array? Uso Elenco tutto il tempo e occasionalmente mi imbatto in Seq, Mappa e simili, ma non ho mai usato né visto Array in natura. È solo lì per la compatibilità con Java? Mi manca un caso d'uso comune?Quando dovrei usare Scala's Array invece di una delle altre raccolte?
risposta
Prima di tutto, facciamo un disclaimer qui. Array
di Scala 2.7 prova ad essere un Java Array
e una Collezione Scala allo stesso tempo. Succede per lo più, ma fallisce in entrambi i casi. Sfortunatamente, questi casi d'angolo possono accadere a brave persone con un codice normale, quindi Scala 2.8 si sta allontanando da quello.
Su Scala 2.8, c'è Array
, che è Java Array
. Ciò significa che è uno spazio di memoria contiguo, che memorizza i riferimenti o le primitive (e, quindi, può avere dimensioni di elementi differenti) e può essere acceduto in modo casuale piuttosto velocemente. Ha anche metodi schifosi, un'orribile implementazione toString
e si comporta male quando si usano generici e primitivi allo stesso tempo (es .: def f[T](a: Array[T]) = ...; f(Array(1,2,3))
).
E, quindi, c'è GenericArray
, che è una Scala Collection supportata da un Array
. Memorizza sempre le primitive in scatola, quindi non ha i problemi di prestazioni quando si mescolano primitive e generici, ma, d'altra parte, non ha i guadagni prestazionali di una matrice primitiva puramente primitiva (non generica).
Quindi, quando usare cosa? Un Array
ha le seguenti caratteristiche:
- O (1) lettura casuale e scrittura
- O (n) di aggiunta/prepend/inserimento/cancellazione
- mutevole
Se non lo fai Hai bisogno di generici, o i tuoi generici possono essere dichiarati come [T <: AnyRef]
, escludendo così le primitive, che sono AnyVal
, e quelle caratteristiche sono ottimali per il tuo codice, quindi vai a prenderlo.
Se hai bisogno di generici, incluse le primitive, e quelle caratteristiche sono ottimali per il tuo codice, usa GenericArray
su Scala 2.8. Inoltre, se desideri una raccolta vera e propria, con tutti i suoi metodi, potresti volerlo anche usare, invece di dipendere da conversioni implicite.
Se si desidera l'immutabilità o se è necessaria una buona prestazione per aggiungere, anteporre, inserire o eliminare, cercare un'altra raccolta.
Grazie, Daniel, questa è un'ottima risposta. – pr1001
Una matrice è appropriata quando si dispone di un numero di elementi della stessa classe (o compatibile), e si conosce in anticipo il conteggio esatto di tali elementi o un limite superiore ragionevole e si è interessati al rapido casuale accesso e forse alterazione sul posto degli oggetti, ma dopo averlo configurato, non inserirai mai o rimuoverò mai elementi da qualche parte nella lista.
In altre parole, si tratta di una struttura di dati aggregata con meno campane e fischi dei tipi di raccolta, con un sovraccarico leggermente inferiore e prestazioni leggermente migliori a seconda di come viene utilizzata.
Un esempio molto ingegnoso: sei nel business della produzione di funzioni, e il test di qualità per queste funzioni consiste nel controllare le loro prestazioni o risultati per un set di 1000 valori di input fissi. Inoltre, decidi di non mantenere questi valori in un file, ma piuttosto li codifichi nel tuo programma. Un array sarebbe appropriato.
L'interfacciamento con le API Java è un caso. Inoltre, diversamente dagli array Java, gli array di livello sono invarianti e quindi non hanno alcun vantaggio sugli elenchi a causa di ciò.
- 1. Quando dovrei usare UIImagePickerControllerSourceTypePhotoLibrary invece di UIImagePickerControllerSourceTypeSavedPhotosAlbum?
- 2. Quando dovrei usare una stringa invece di stringstream?
- 3. Quando dovrei usare una mappa invece di un ciclo For?
- 4. Quando dovrei usare NSURL invece di NSString e viceversa?
- 5. Quando dovrei usare print invece di echo in PHP?
- 6. Dovrei usare String invece di TFilename?
- 7. Quando dovrei usare le variabili di sessione invece dei cookie?
- 8. Perché dovrei usare url.openStream invece di url.getContent?
- 9. Dovrei usare JDBC getNString() invece di getString()?
- 10. Perché dovrei usare log.Println invece di fmt.Println?
- 11. Quando dovrei usare ConcurrentSkipListMap?
- 12. C# Quando dovrei usare List e quando dovrei usare l'arraylist?
- 13. Quando dovrei usare CompiledQuery?
- 14. Quando dovrei usare AQL?
- 15. Quando dovrei usare setUpClass e quando __init__?
- 16. Quando dovrei usare l'inizializzazione uniforme?
- 17. PHP quando usare filter_var invece delle funzioni php integrate
- 18. Quando dovrei usare # in ColdFusion?
- 19. C++ - quando dovrei usare un membro pointer in una classe
- 20. Quando dovrei usare metodi statici?
- 21. Quando dovrei usare un parser?
- 22. Quando dovrei usare require() e quando usare define()?
- 23. Quando dovrei usare l'Interface Builder?
- 24. Perché dovrei usare un LoadBalancerProbe invece di iscrivermi all'evento RoleEnvironment.StatusCheck?
- 25. dovrei usare Entity Framework invece di raw ADO.NET
- 26. Quando dovrei usare git stash?
- 27. Quando dovrei usare questo.x vs var x?
- 28. perché dovrei usare il servizio Android invece di java thread
- 29. Quando dovrei usare Sql Azure e quando dovrei usare la tabella Storage?
- 30. Quando dovrei usare C++ anziché SQL?
Devo fare di questo un wiki della comunità? – pr1001
Io non la penso così. I pro e i contro dell'uso di Scala's Array sono abbastanza ben definiti e possono essere discussi obiettivamente. La domanda è valida, IMHO. –