web-dev-qa-db-fra.com

Quelles sont les différences entre ArrayList et Vector?

Quelles sont les différences entre les deux structures de données ArrayList et Vector, et où devriez-vous utiliser chacune d’elles?

333
KushalP

Différences

  • Les vecteurs sont synchronisés, les ArrayLists ne le sont pas.
  • Méthodes de croissance des données

Utilisez ArrayLists s'il n'y a pas d'exigence spécifique d'utiliser des vecteurs.

Synchronisation

Si plusieurs threads accèdent simultanément à une ArrayList, nous devons synchroniser en externe le bloc de code qui modifie la liste de manière structurelle ou simplement un élément. Par modification structurelle, on entend l’ajout ou la suppression d’élément (s) de la liste. Définir la valeur d'un élément existant n'est pas une modification structurelle.

Collections.synchronizedList est normalement utilisé au moment de la création de la liste pour éviter tout accès non synchronisé accidentel à la liste.

référence

Croissance des données

En interne, ArrayList et Vector conservent leur contenu à l'aide d'un tableau. Lorsqu'un élément est inséré dans un ArrayList ou un vecteur, l'objet doit développer son tableau interne s'il manque de place. Par défaut, un vecteur double la taille de son tableau, tandis que ArrayList augmente sa taille de 50%.

référence

350
Sev

Comme le dit la documentation, une Vector et un ArrayList sont presque équivalentes. La différence est que l'accès à Vector est synchronisé, alors que l'accès à ArrayList ne l'est pas. Cela signifie qu'un seul thread peut appeler des méthodes sur un Vector à la fois, et l'acquisition du verrou entraîne une légère surcharge. si vous utilisez un ArrayList, ce n'est pas le cas. Généralement, vous voudrez utiliser un ArrayList; dans le cas d'un seul fil, c'est un meilleur choix, et dans le cas d'un multi-fil, vous obtenez un meilleur contrôle du verrouillage. Voulez-vous autoriser les lectures simultanées? Bien. Vous souhaitez effectuer une synchronisation pour un lot de dix écritures? Aussi très bien. Cela demande un peu plus d'attention de votre part, mais c'est probablement ce que vous voulez. Notez également que si vous avez une liste de tableaux, vous pouvez utiliser la fonction Collections.synchronizedList pour créer une liste synchronisée, vous donnant ainsi l'équivalent d'un Vector.

82

Vector est une classe cassée qui est pas threadsafe, même si elle est "synchronisée" et est uniquement utilisé par les étudiants et d’autres programmeurs inexpérimentés.

ArrayList est l'implémentation Go-to List utilisée par les professionnels et les programmeurs expérimentés.

Les professionnels souhaitant une mise en œuvre threadsafe list utilisent un CopyOnWriteArrayList .

48
Bohemian

ArrayList est plus récent et 20-30% plus rapide.

Si vous n'avez pas besoin de quelque chose explicitement apparent dans Vector, utilisez ArrayList

26
Oli

Il existe 2 différences majeures entre Vector et ArrayList.

  1. Le vecteur est synchronisé par défaut et ArrayList ne l’est pas. Remarque: vous pouvez rendre ArrayList également synchronisé en transmettant l'objet arraylist à la méthode Collections.synchronizedList (). Synchronisé signifie: il peut être utilisé avec plusieurs threads sans aucun effet secondaire.

  2. ArrayLists augmente de 50% de la taille précédente lorsque l'espace n'est pas suffisant pour le nouvel élément, alors que Vector augmentera de 100% de la taille précédente s'il n'y a pas d'espace pour le nouvel élément entrant.

En dehors de cela, il y a quelques différences pratiques entre eux, en termes d'effort de programmation:

  1. Pour obtenir l'élément à un emplacement particulier à partir de Vector, nous utilisons la fonction elementAt (int index). Ce nom de fonction est très long. À la place de ceci dans ArrayList nous avons get (int index) qui est très facile à mémoriser et à utiliser.
  2. De même, pour remplacer un élément existant par un nouvel élément dans Vector, nous utilisons la méthode setElementAt (), qui est à nouveau très longue et peut inciter le programmeur à utiliser plusieurs fois. Au lieu de cela, ArrayList a la méthode add (int index, object) qui est facile à utiliser et à mémoriser. Comme cela, ils ont des noms de fonctions plus conviviaux pour les programmeurs et faciles à utiliser dans ArrayList.

Quand utiliser lequel?

  1. Essayez d'éviter d'utiliser complètement les vecteurs. ArrayLists peut faire tout ce qu'un vecteur peut faire. De plus, ArrayLists n'est pas synchronisé par défaut. Si vous le souhaitez, vous pouvez le synchroniser à tout moment en utilisant la classe Collections util.
  2. ArrayList est facile à retenir et à utiliser des noms de fonctions.

Note: même si arraylist croît de 100%, vous pouvez éviter cela avec la méthode ensurecapacity () pour vous assurer que vous allouez suffisamment de mémoire aux étapes initiales.

J'espère que ça aide.

22
user1923551

ArrayList et Vector implémentent tous les deux l'interface et maintiennent l'ordre d'insertion. Mais il existe de nombreuses différences entre les classes ArrayList et Vector ...

ArrayList -

  1. ArrayList n'est pas synchronisé.
  2. ArrayList incrémente 50% de la taille actuelle du tableau si le nombre d'éléments dépasse sa capacité.
  3. ArrayList n'est pas une classe héritée, elle est introduite dans JDK 1.2.
  4. ArrayList est rapide car non synchronisé.
  5. ArrayList utilise l'interface Iterator pour parcourir les éléments.

Vecteur -

  1. Vector est synchronisé.
  2. Vector incrémente de 100% signifie que la taille du tableau double si le nombre total d'éléments dépasse sa capacité.
  3. Vector est une classe héritée.

  4. Vector est lent car il est synchronisé, c'est-à-dire que, dans un environnement multithreading, les autres threads seront en état d'exécution ou non exécutable jusqu'à ce que le thread actuel libère le verrou d'objet.

  5. Vector utilise l'interface Enumeration pour parcourir les éléments. Mais il peut aussi utiliser Iterator.

Voir aussi: https://www.javatpoint.com/difference-between-arraylist-and-vector

14
roottraveller

Fondamentalement, ArrayList et Vector utilisent tous les deux un tableau d'objets interne.

ArrayList: La classe ArrayList étend AbstractList et implémente l'interface List et RandomAccess (interface de marqueur). ArrayList prend en charge les tableaux dynamiques pouvant se développer en fonction des besoins. Cela nous donne la première itération sur les éléments. ArrayList utilise un tableau d'objets interne; ils sont créés avec une taille initiale par défaut de 10. Lorsque cette taille est dépassée, la collection augmente automatiquement jusqu'à la moitié de la taille par défaut de 15.

Vector: Le vecteur est similaire à ArrayList mais les différences le sont, il est synchronisé et sa taille initiale par défaut est 10, et lorsque la taille dépasse sa taille, sa taille passe au double de la taille d'origine, ce qui signifie que la nouvelle taille sera 20. Vector est la seule classe autre que ArrayList à implémenter RandomAccess. Vector est composé de quatre constructeurs qui prennent deux paramètres Vector (int initialCapacity, int capacityIncrement) capacityIncrement est la quantité par laquelle la capacité est augmentée lorsque le vecteur déborde, afin de mieux contrôler la charge. facteur.

Quelques autres différences sont: enter image description here

10
subhashis