Vector ou ArrayList - quel est le meilleur?

Q: Vector ou ArrayList - quel est le meilleur et pourquoi?

R: Parfois, Vectorc'est mieux; c'est parfois ArrayListmieux; parfois vous ne voulez pas utiliser non plus. J'espère que vous ne cherchiez pas une réponse facile parce que la réponse dépend de ce que vous faites. Il y a quatre facteurs à considérer:

  • API
  • Synchronisation
  • Croissance des données
  • Modèles d'utilisation

Explorons chacun à son tour.

API

Dans The Java Programming Language (Addison-Wesley, juin 2000), Ken Arnold, James Gosling et David Holmes décrivent le Vectorcomme un analogue du ArrayList. Donc, du point de vue de l'API, les deux classes sont très similaires. Cependant, il existe encore des différences majeures entre les deux classes.

Synchronisation

Vectorssont synchronisés. Toute méthode qui touche le Vectorcontenu de est thread-safe. ArrayList, en revanche, ne sont pas synchronisés, ce qui les rend non thread-safe. Avec cette différence à l'esprit, l'utilisation de la synchronisation entraînera un impact négatif sur les performances. Donc, si vous n'avez pas besoin d'une collection thread-safe, utilisez le ArrayList. Pourquoi payer inutilement le prix de la synchronisation?

Croissance des données

En interne, à la fois le ArrayListet Vectorconservent leur contenu à l'aide d'un fichier Array. Vous devez garder ce fait à l'esprit lorsque vous utilisez l'un ou l'autre dans vos programmes. Lorsque vous insérez un élément dans un ArrayListou un Vector, l'objet devra étendre son tableau interne s'il manque de place. Par Vectordéfaut, A double la taille de son tableau, tandis que leArrayListaugmente la taille de sa matrice de 50%. En fonction de la façon dont vous utilisez ces classes, vous pourriez finir par avoir un gros impact sur les performances lors de l'ajout de nouveaux éléments. Il est toujours préférable de définir la capacité initiale de l'objet sur la plus grande capacité dont votre programme aura besoin. En définissant soigneusement la capacité, vous pouvez éviter de payer la pénalité nécessaire pour redimensionner la matrice interne ultérieurement. Si vous ne savez pas combien de données vous aurez, mais que vous connaissez la vitesse à laquelle elles se développent, Vectorvous avez un léger avantage car vous pouvez définir la valeur d'incrémentation.

Modèles d'utilisation

Les deux ArrayListet Vectorsont utiles pour récupérer des éléments à partir d'une position spécifique dans le conteneur ou pour ajouter et supprimer des éléments de l'extrémité du conteneur. Toutes ces opérations peuvent être effectuées en temps constant - O (1) . Cependant, ajouter et supprimer des éléments de toute autre position s'avère plus coûteux - linéaire pour être exact: O (ni),n est le nombre d'éléments et i est l'indice de l'élément ajouté ou supprimé. Ces opérations sont plus coûteuses car vous devez décaler tous les éléments à l'indice i et plus d'un élément. Alors que veut dire tout cela?

Cela signifie que si vous souhaitez indexer des éléments ou ajouter et supprimer des éléments à la fin du tableau, utilisez un Vectorou un ArrayList. Si vous voulez faire autre chose sur le contenu, cherchez une autre classe de conteneur. Par exemple, le LinkedListpeut ajouter ou supprimer un élément à n'importe quelle position en temps constant - O (1). Cependant, l'indexation d'un élément est un peu plus lente - O (i)i est l'indice de l'élément. Traverser un ArrayListest également plus facile puisque vous pouvez simplement utiliser un index au lieu d'avoir à créer un itérateur. Le LinkedListcrée également un objet interne pour chaque élément inséré. Vous devez donc être conscient des déchets supplémentaires créés.

Enfin, dans "PRAXIS 41" de Practical Java (Addison-Wesley, février 2000), Peter Haggar suggère que vous utilisiez un ancien tableau à la place de l'un Vectorou l' autre ArrayList, en particulier pour le code critique en termes de performances. En utilisant un tableau, vous pouvez éviter la synchronisation, les appels de méthode supplémentaires et le redimensionnement sous-optimal. Vous ne payez que le coût du temps de développement supplémentaire.

En savoir plus sur ce sujet

  • Le langage de programmation Java Ken Arnold, James Gosling et David Holmes (Addison-Wesley, juin 2000; ISBN0201704331)

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

  • Practical Java Peter Haggar (Addison-Wesley, février 2000; ISBN0201616467)

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

  • Vouloir plus? Consultez l' index des questions-réponses Java pour le catalogue complet

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

  • Pour plus de 100 conseils Java perspicaces de certains des meilleurs esprits dans l'entreprise, visitez le JavaWorld » s Java Conseils index

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

  • Inscrivez-vous à la newsletter hebdomadaire gratuite de JavaWorld This Week pour découvrir les nouveautés de JavaWorld

    //idg.net/jw-subscribe

Cette histoire, "Vector ou ArrayList - quel est le meilleur?" a été initialement publié par JavaWorld.