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ù faut-il les utiliser?

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’obligation spécifique d’utiliser des vecteurs.

Synchronisation

Si plusieurs threads accèdent simultanément à une ArrayList, nous devons synchroniser de manière externe le bloc de code qui modifie la liste, soit structurellement, soit simplement en modifiant un élément. La modification structurelle signifie l’ajout ou la suppression d’un ou plusieurs éléments de la liste. La définition de 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 access accidentel non synchronisé à 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 une ArrayList ou un Vector, l’object doit étendre son tableau interne s’il manque d’espace. Un vecteur double par défaut la taille de son tableau, tandis que ArrayList augmente sa taille de tableau de 50%.

Référence

Comme le dit la documentation, un Vector et un ArrayList sont presque équivalents. La différence est que l’access à un Vector est synchronisé, tandis que l’access à une liste de ArrayList n’est pas. Cela signifie qu’un seul thread peut appeler des méthodes sur un Vector à la fois et que l’acquisition du verrou entraîne une légère surcharge. Si vous utilisez une ArrayList , ce n’est pas le cas. En règle générale, vous souhaiterez utiliser une ArrayList ; dans le cas d’un seul filetage, c’est un meilleur choix, et dans le cas du multithread, vous obtenez un meilleur contrôle du locking. Voulez-vous autoriser les lectures simultanées? Bien. Vous souhaitez effectuer une synchronisation pour un lot de dix écritures? Aussi très bien. Cela exige un peu plus de soin de votre part, mais c’est probablement ce que vous voulez. Notez également que si vous avez une ArrayList, vous pouvez utiliser la fonction Collections.synchronizedList pour créer une liste synchronisée, vous obtenant ainsi l’équivalent d’un Vector .

Vector est une classe brisée qui n’est pas sécurisée, même si elle est “synchronisée” et utilisée uniquement par les étudiants et autres programmeurs inexpérimentés.

ArrayList est l’implémentation de la liste de contrôle utilisée par les professionnels et les programmeurs expérimentés.

Les professionnels souhaitant une implémentation de liste threadsafe utilisent un CopyOnWriteArrayList .

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

Si vous n’avez pas besoin de quelque chose d’explicite dans Vector , utilisez ArrayList

Il existe deux principales différences entre Vector et ArrayList.

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

  2. Les ArrayLists augmentent de 50% par rapport à la taille précédente lorsque l’espace n’est pas suffisant pour un nouvel élément, où le vecteur augmentera de 100% par rapport à la taille précédente lorsqu’il n’y a plus d’espace pour un nouvel élément entrant.

En dehors de cela, il existe des différences pratiques entre eux, en termes d’effort de programmation:

  1. Pour obtenir l’élément à un endroit particulier de Vector, nous utilisons la fonction elementAt (int index). Ce nom de fonction est très long. A la place de cela 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 irriter le programmeur à utiliser à plusieurs resockets. Au lieu de cela, ArrayList a la méthode add (int index, object) facile à utiliser et à mémoriser. Comme cela, ils ont plus de noms de fonctions conviviaux et faciles à utiliser dans ArrayList.

Quand utiliser lequel?

  1. Essayez d’éviter d’utiliser les vecteurs complètement. ArrayLists peut faire tout ce qu’un vecteur peut faire. Plus sur ArrayLists sont par défaut non synchronisés. Si vous le souhaitez, vous pouvez le synchroniser quand vous en avez besoin en utilisant la classe Collections util.
  2. ArrayList a facile à retenir et à utiliser des noms de fonctions.

Remarque : même si arraylist augmente de 100%, vous pouvez éviter cela par la méthode ensurecapacity () pour vous assurer que vous allouez suffisamment de mémoire aux étapes initiales.

J’espère que cela aide.

ArrayList et Vector utilisent tous deux des objects internes.

ArrayList: la classe ArrayList étend AbstractList et implémente l’interface List et RandomAccess (interface de marqueur). ArrayList prend en charge les tableaux dynamics pouvant évoluer selon les besoins. Cela nous donne une première itération sur les éléments. ArrayList utilise un tableau d’objects 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 qui est 15.

Vector: Vector est similaire à ArrayList, mais les différences sont, il est synchronisé et sa taille initiale par défaut est 10 et lorsque la taille dépasse sa taille double pour atteindre la taille d’origine, ce qui signifie que la nouvelle taille sera 20. Le vecteur est la seule classe autre que ArrayList pour implémenter RandomAccess. Vector a quatre constructeurs sur lesquels on prend deux parameters Vector (int initialCapacity, int capacityIncrement) capacityIncrement est la quantité par laquelle la capacité est augmentée lorsque le vecteur déborde, ce qui lui permet de mieux contrôler le facteur de charge.

Quelques autres différences sont: entrer la description de l'image ici

ArrayList et Vector implémentent tous deux l’interface List et maintiennent l’ordre d’insertion. Mais il existe de nombreuses différences entre Vector 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, il est introduit dans JDK 1.2.
  4. ArrayList est rapide car il n’est pas synchronisé.
  5. ArrayList utilise l’interface Iterator pour parcourir les éléments.

Vecteur –

  1. Vector est synchronisé.
  2. Incréments Vector 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, il tiendra les autres threads dans un état exécutable ou non exécutable jusqu’à ce que le thread actuel libère la serrure de l’object.

  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

ArrayList Vs Vector:

1) Synchronisation: ArrayList n’est pas synchronisé, ce qui signifie que plusieurs threads peuvent travailler sur ArrayList en même temps. Par exemple, si un thread effectue une opération d’ajout sur ArrayList, il peut y avoir un autre thread effectuant une opération de suppression sur ArrayList en même temps dans un environnement multithread.

pendant que Vector est synchronisé. Cela signifie que si un thread travaille sur Vector, aucun autre thread ne peut le saisir. Contrairement à ArrayList, un seul thread peut effectuer une opération sur un vecteur à la fois.

2) Redimensionner: ArrayList et Vector peuvent tous deux se développer et se réduire de manière dynamic pour conserver une utilisation optimale du stockage, mais la manière dont ils sont redimensionnés est différente. ArrayList augmente de moitié par rapport à sa taille lors du redimensionnement alors que Vector double sa taille par défaut lorsque sa taille augmente.

3) Performance: ArrayList donne de meilleures performances car il n’est pas synchronisé. Les opérations vectorielles donnent des performances médiocres car elles sont sécurisées pour les threads, le thread qui fonctionne sur Vector obtient un verrou qui fait que les autres threads attendent que le verrou soit libéré.

4) rapide: permettez-moi d’abord d’expliquer ce qui est rapide: si la collection (ArrayList, vector etc) est structurellement modifiée par tous les moyens, à l’exception des méthodes add ou remove de l’iterator, après la création de l’iterator ConcurrentModificationException. La modification structurelle fait référence à l’ajout ou à la suppression d’éléments de la collection.

Conformément au vecteur javadoc, l’énumération renvoyée par Vector n’est pas rapide. De l’autre côté, l’iterator et listIterator renvoyés par ArrayList sont rapides.

5) Qui appartient réellement au cadre de collecte? Le vecteur ne faisait pas partie du cadre de collecte, il a été inclus dans les collections plus tard. Il peut être considéré comme un code hérité. Il n’y a rien à propos de Vector que la collection List ne peut pas faire. Par conséquent, Vector devrait être évité. S’il existe un besoin d’opération thread-safe, synchronisez ArrayList comme indiqué dans la section suivante de cet article ou utilisez CopyOnWriteArrayList qui est une variante de ArrayList compatible avec les threads.

Il y a peu de similitudes entre ces classes qui sont les suivantes:

Vector et ArrayList utilisent tous deux growable array data structure . L’iterator et listIterator renvoyés par ces classes (Vector et ArrayList) sont fail-fast . Ils sont tous les deux ordered collection classes de ordered collection lorsqu’ils maintiennent l’ordre d’insertion des éléments. Vector & ArrayList allows duplicate and null values fois allows duplicate and null values . Ils grandissent et se rétrécissent automatiquement lorsque le débordement et la suppression se produisent.

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

  2. Les ArrayLists augmentent de 50% par rapport à la taille précédente lorsque l’espace n’est pas suffisant pour un nouvel élément, où le vecteur augmentera de 100% par rapport à la taille précédente lorsqu’il n’y a plus d’espace pour un nouvel élément entrant.

Similitudes

  • Les deux collections implémentent une interface de liste et exposent donc des opérations similaires pour les opérations d’ajout, de modification et de suppression.
  • Les deux stockent leurs éléments dans un tableau dynamic dans la mémoire.
  • Les deux maintiennent l’ordre d’insertion de leurs éléments, c’est-à-dire que les éléments sont récupérés dans le même ordre d’insertion.
  • Les deux permettent des éléments nuls et en double.

Différences

  • Vector est implicitement synchronisé, il fonctionne parfaitement avec les environnements multithread. A chaque access, le thread acquiert un verrou sur le vecteur, empêchant ainsi tout autre thread de le modifier simultanément. En revanche, ArrayList n’est pas synchronisé par défaut, de sorte que plusieurs threads peuvent y accéder et le modifier simultanément. Pour réaliser la synchronisation, un développeur doit explicitement entourer chaque modification sur ArrayList avec un bloc synchronisé OU le convertir en une liste synchronisée à l’aide de Collections.synchronizedList.
  • ArrayList est plus rapide que Vector car Vector vérifie implicitement la synchronisation sur chaque appel de méthode, même dans un seul environnement threadé.
  • Vector et ArrayList utilisent un tableau dynamic pour stocker leurs éléments. Lorsque ce tableau est trop éloigné, ArrayList augmente la taille du tableau à 50% de la taille actuelle, tandis que Vector l’augmente à 100%. Donc, clairement, Vector consum plus de mémoire que ArrayList.

Référence: ArrayList vs Vector