Différence entre ArrayList et Vector En java
ArrayList et Vector utilisent tous deux Array comme structure de données en interne. Cependant, il existe peu de différences dans la façon dont ils stockent et traitent les données. Dans cet article, nous discuterons de la différence et des similitudes entre ArrayList et Vector.
ArrayList Vs Vector:
1) Synchronisation: ArrayList n’est pas synchronisée, ce qui signifie que plusieurs threads peuvent fonctionner sur ArrayList en même temps. Par ex. si un thread effectue une opération d’ajout sur ArrayList, un autre thread peut effectuer une opération de suppression sur ArrayList en même temps dans un environnement multithread
alors que le vecteur est synchronisé. Cela signifie que si un thread travaille sur le vecteur, aucun autre thread ne peut s’en emparer. Contrairement à ArrayList, un seul thread peut effectuer une opération sur le vecteur à la fois.
2) Redimensionnement: ArrayList et Vector peuvent croître et se rétrécir dynamiquement pour maintenir l’utilisation optimale du stockage, mais la façon dont ils sont redimensionnés est différente. ArrayList augmente de moitié de sa taille lorsqu’elle est redimensionnée tandis que le vecteur double la taille de lui-même par défaut lorsqu’il grandit.
3) Performances: ArrayList donne de meilleures performances car elle n’est pas synchronisée. Les opérations vectorielles donnent de mauvaises performances car elles sont sûres pour les threads, le thread qui fonctionne sur le vecteur obtient un verrou qui fait attendre les autres threads jusqu’à ce que le verrou soit libéré.
4) fail-fast: Permettez-moi d’abord d’expliquer ce qui est fail-fast: Si la collection (ArrayList, vector, etc.) est modifiée structurellement par n’importe quel moyen, à l’exception des méthodes d’ajout ou de suppression de l’itérateur, après la création de l’itérateur, l’itérateur lancera ConcurrentModificationException
. La modification structurelle fait référence à l’ajout ou à la suppression d’éléments de la collection.
Selon le vecteur javadoc, l’énumération renvoyée par le vecteur n’est pas rapide. De l’autre côté, l’itérateur et le listIterator renvoyés par ArrayList sont rapides.
5) Qui appartient vraiment au cadre de collecte? Le vecteur n’était pas la 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 sur le vecteur que la collection de listes ne peut pas faire. Par conséquent, le vecteur doit être évité. S’il y a 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 thread-safe de ArrayList.
Il y a peu de similitudes entre ces classes qui sont les suivantes:
- Vector et ArrayList utilisent une structure de données de tableau cultivable.
- L’itérateur et le listIterator renvoyés par ces classes (Vector et ArrayList) sont rapides.
- Ils sont tous deux des classes de collection ordonnées car ils maintiennent l’ordre d’insertion des éléments.
- Vector & ArrayList permet à la fois des valeurs en double et nulles.
- Ils se développent et se rétrécissent automatiquement lorsque le débordement et la suppression se produisent.
Quand utiliser ArrayList et quand utiliser vector?
Cela dépend totalement de l’exigence. S’il est nécessaire d’effectuer une opération « thread-safe », le vecteur est votre meilleur pari car il garantit qu’un seul thread accède à la collection à la fois.
Performances: Les opérations synchronisées consomment plus de temps que les opérations non synchronisées, donc s’il n’y a pas besoin d’une opération thread safe, ArrayList est un meilleur choix car les performances seront améliorées en raison des processus simultanés.
Comment synchroniser ArrayList ?
Comme je l’ai dit ci-dessus, les méthodes ArrayList ne sont pas synchronisées, mais s’il y a un besoin, vous pouvez les synchroniser comme ceci –
//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}