Vector o ArrayList: qual è il migliore?

D: Vector o ArrayList: qual è il migliore e perché?

A: A volte Vectorè meglio; a volte ArrayListè meglio; a volte non vuoi usare neanche. Spero che tu non stia cercando una risposta facile perché la risposta dipende da quello che stai facendo. Ci sono quattro fattori da considerare:

  • API
  • Sincronizzazione
  • Crescita dei dati
  • Modelli di utilizzo

Esploriamo ciascuno a turno.

API

In The Java Programming Language (Addison-Wesley, giugno 2000) Ken Arnold, James Gosling e David Holmes descrivono il Vectorcome un analogo al ArrayList. Quindi, dal punto di vista dell'API, le due classi sono molto simili. Tuttavia, ci sono ancora alcune differenze importanti tra le due classi.

Sincronizzazione

Vectorssono sincronizzati. Qualsiasi metodo che tocchi il Vectorcontenuto di è thread-safe. ArrayList, d'altra parte, non è sincronizzato, rendendoli quindi non thread-safe. Con questa differenza in mente, l'utilizzo della sincronizzazione incorrerà in un calo delle prestazioni. Quindi, se non hai bisogno di una raccolta thread-safe, usa il file ArrayList. Perché pagare inutilmente il prezzo della sincronizzazione?

Crescita dei dati

Internamente, sia il ArrayListche Vectormantengono il loro contenuto usando un Array. È necessario tenere a mente questo fatto durante l'utilizzo di entrambi nei programmi. Quando si inserisce un elemento in un ArrayListo in Vector, l'oggetto dovrà espandere il proprio array interno se si esaurisce lo spazio. Un Vectorvalore predefinito per raddoppiare la dimensione del suo array, mentre ilArrayListaumenta la dimensione dell'array del 50 percento. A seconda di come usi queste classi, potresti finire per subire un grande colpo di prestazioni mentre aggiungi nuovi elementi. È sempre meglio impostare la capacità iniziale dell'oggetto sulla massima capacità di cui avrà bisogno il programma. Impostando attentamente la capacità, è possibile evitare di pagare la penale necessaria per ridimensionare l'array interno in un secondo momento. Se non sai quanti dati avrai, ma conosci la velocità con cui crescono, Vectorhai un leggero vantaggio poiché puoi impostare il valore di incremento.

Modelli di utilizzo

Sia il ArrayListche Vectorsono utili per recuperare elementi da una posizione specifica nel contenitore o per aggiungere e rimuovere elementi dalla fine del contenitore. Tutte queste operazioni possono essere eseguite a tempo costante - O (1) . Tuttavia, l'aggiunta e la rimozione di elementi da qualsiasi altra posizione risulta più costosa - lineare per essere esatti: O (ni), dove n è il numero di elementi e i è l'indice dell'elemento aggiunto o rimosso. Queste operazioni sono più costose perché devi spostare tutti gli elementi all'indice ie più in alto di un elemento. Allora cosa significa tutto questo?

Significa che se vuoi indicizzare elementi o aggiungere e rimuovere elementi alla fine dell'array, usa un Vectoro un ArrayList. Se vuoi fare qualcos'altro ai contenuti, vai a trovarti un'altra classe contenitore. Ad esempio, LinkedListpuò aggiungere o rimuovere un elemento in qualsiasi posizione in tempo costante - O (1). Tuttavia, l'indicizzazione di un elemento è un po 'più lenta - O (i) dove i è l'indice dell'elemento. Attraversare un ArrayListè anche più facile poiché puoi semplicemente usare un indice invece di dover creare un iteratore. Il LinkedListcrea anche un oggetto interno per ciascun elemento inserito. Quindi devi essere consapevole della spazzatura extra che viene creata.

Infine, in "PRAXIS 41" da Practical Java (Addison-Wesley, febbraio 2000) Peter Haggar suggerisce di utilizzare un semplice vecchio array al posto di Vectoro ArrayList, specialmente per il codice critico per le prestazioni. Utilizzando un array è possibile evitare la sincronizzazione, chiamate di metodi extra e un ridimensionamento non ottimale. Paghi solo il costo del tempo di sviluppo aggiuntivo.

Ulteriori informazioni su questo argomento

  • Il linguaggio di programmazione Java Ken Arnold, James Gosling e David Holmes (Addison-Wesley, giugno 2000; ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • Practical Java Peter Haggar (Addison-Wesley, febbraio 2000; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • Voglio di più? Vedere l' indice di domande e risposte Java per il catalogo completo di domande e risposte

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Per oltre 100 suggerimenti penetranti Java da alcune delle migliori menti del settore, visita 'JavaWorld s Tips Java Indice

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Iscriviti alla newsletter settimanale gratuita di JavaWorld This Week per scoprire le novità di JavaWorld

    //idg.net/jw-subscribe

Questa storia, "Vector o ArrayList - quale è meglio?" è stato originariamente pubblicato da JavaWorld.