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ù devez-vous les utiliser?

294
demandé sur Draken 2010-06-07 03:07:31

9 réponses

différences

  • les vecteurs sont synchronisés, ArrayLists ne le sont pas.
  • La Croissance Des Données Méthodes

utiliser des tableaux si l'utilisation de vecteurs n'est pas expressément requise.

synchronisation

si plusieurs threads accèdent simultanément à un ArrayList, alors nous devons synchroniser extérieurement le bloc de code qui modifie la liste soit structurellement ou simplement modifier un élément. Par modification structurelle, on entend l'ajout ou la suppression d'un ou de plusieurs éléments de la liste. Réglage 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 accès accidentel non synchronisé à la liste.

référence

données croissance

sur le plan interne, L'ArrayList et le vecteur retiennent leur contenu à l'aide d'un réseau. Lorsqu'un élément est inséré dans un ArrayList ou un vecteur, l'objet devra étendre son réseau interne s'il manque de place. un vecteur double par défaut la taille de son réseau, tandis que L'ArrayList augmente sa taille de réseau de 50 pour cent.

référence

321
répondu Sev 2017-02-20 21:03:17

comme le dit la documentation, un Vector et un ArrayList sont presque équivalents. La différence est que l'accès à un Vector est synchronisé, alors que l'accès à un ArrayList ne l'est pas. Ce que cela signifie est qu'un seul thread peut appeler des méthodes sur un Vector à la fois, et il y a un léger overhead dans l'acquisition de la serrure; si vous utilisez un ArrayList , ce n'est pas le cas. Généralement, vous voudrez utiliser un ArrayList ; dans le cas à filetage simple, c'est un meilleur choix, et dans le cas à filetage multiple, vous obtenez un meilleur contrôle sur le verrouillage. Souhaitez autoriser simultanées lit? Fin. Souhaitez effectuer une synchronisation pour un lot de dix écrit? Aussi bien. Elle nécessite un peu plus de soin sur votre fin, mais c'est probablement ce que vous voulez. Notez également que si vous avez un ArrayList, vous pouvez utiliser la fonction Collections.synchronizedList pour créer une liste synchronisée, vous obtenant ainsi le l'équivalent d'un Vector .

77
répondu Antal Spector-Zabusky 2010-06-06 23:13:48

Vector est un cassé classe qui est pas threadsafe, malgré qu'il soit "synchronisé" et est seulement utilisé par les étudiants et d'autres programmeurs inexpérimentés.

ArrayList est la liste de mise en œuvre utilisée par les professionnels et les programmeurs expérimentés.

professionnels voulant une mise en œuvre de la liste threadsafe utiliser un CopyOnWriteArrayList .

38
répondu Bohemian 2017-05-23 12:10:11

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

si vous n'avez pas besoin de quelque chose qui apparaît explicitement dans Vector , utilisez ArrayList

24
répondu Oli 2010-06-06 23:13:22

il y a deux différences majeures entre vecteur et ArrayList.

  1. le vecteur est synchronisé par défaut, et ArrayList ne l'est pas. Note: Vous pouvez également synchroniser ArrayList en passant l'objet arraylist aux Collections.synchronizedList() la méthode. Synchronisé signifie : il peut être utilisé avec plusieurs threads sans aucun effet secondaire.

  2. les Aréolistes augmentent de 50% de la taille précédente quand l'espace n'est pas suffisant pour un nouvel élément, où comme vecteur croîtra de 100% de la taille précédente quand il n'y a pas d'espace pour un nouvel élément entrant.

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

  1. pour obtenir L'élément à un endroit particulier à partir du vecteur, nous utilisons elementate (int index) fonction. Ce nom de fonction est très long. À la place de cela dans ArrayList nous avons get (index int) qui est très facile à retenir 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 de nouveau très longue et peut irriter le programmeur à utiliser à plusieurs reprises. À la place de cet ArrayList a ajouter (index int, objet) méthode qui est facile à utiliser et à mémoriser. Comme cela, ils ont programmeur plus convivial et facile à utiliser des noms de fonction dans ArrayList.

quand utiliser lequel?

  1. essayez d'éviter d'utiliser des vecteurs complètement. Les ArrayLists peuvent faire tout ce qu'un vecteur peut faire. Plus de tableaux ne sont pas synchronisés par défaut. Si vous voulez, vous pouvez le synchroniser quand jamais vous avez besoin en utilisant Collections util class.
  2. ArrayList a facile à retenir et à utiliser des noms de fonction.

Note : même si arraylist augmente de 100%, Vous pouvez éviter cela en ensurecapacity() méthode pour s'assurer que vous allouez suffisamment de mémoire aux étapes initiales elle-même.

J'espère que ça aidera.

21
répondu user1923551 2016-03-10 11:33:35

ArrayList et Vector les deux implémente la Liste de l'interface et maintient 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éments 50% de la taille actuelle du réseau si le nombre d'éléments dépasse sa capacité.
  3. ArrayList n'est pas un héritage de la classe, il est introduit dans le JDK 1.2.
  4. ArrayList est rapide parce qu'il n'est pas synchronisé.
  5. ArrayList utilise l'interface Itératrice pour traverser les éléments.

vecteur -

  1. Vector est synchronisé.
  2. Vector incréments 100% signifie que la taille du réseau double si le nombre total d'éléments dépasse sa capacité.
  3. Vector est une classe de legs.

  4. Vector est lent parce qu'il est synchronisé c.-à-d. Dans un environnement multithreading, il maintiendra les autres threads dans un État runnable ou non runnable jusqu'à ce que le thread courant libère la serrure de l'objet.

  5. Vector utilise l'interface d'Énumération pour parcourir les éléments. Mais il peut utiliser l'Itérateur aussi.

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

10
répondu roottraveller 2017-07-31 09:14:24

utilise un tableau D'objets internes.

ArrayList: la classe ArrayList étend AbstractList et implémente L'interface List et RandomAccess (marker interface). ArrayList supporte les tableaux dynamiques qui peuvent se développer au besoin. Il nous donne la première itération sur les éléments. ArrayList utilise le 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 collecte est augmente automatiquement à la moitié de la taille par défaut est 15.

vecteur: vecteur est similaire à ArrayList, mais les différences sont, il est synchronisé et sa taille initiale par défaut est de 10 et lorsque la taille dépasse sa taille augmente au double de la taille d'origine qui signifie que la nouvelle taille sera de 20. Vector est la seule classe autre que ArrayList à implémenter RandomAccess. Vectoriel a quatre constructeurs dont un prend deux paramètres Vecteur(int initialCapacity, int capacityIncrement) capacityIncrement est le montant par lequel la capacité est augmentée lorsque le vecteur de débordements, de sorte qu'il ont plus de contrôle sur le facteur de charge.

Quelques autres différences sont: enter image description here

9
répondu subhashis 2015-04-23 15:31:07

ArrayList Vs Vector:

1) "151950920 de Synchronisation": ArrayList est non-synchronisées, ce qui signifie plusieurs threads peuvent travailler sur la liste de tableaux en même temps. Par exemple, si un fil effectue une opération d'ajout sur ArrayList, il peut y avoir un autre fil effectuant une opération d'enlèvement sur ArrayList en même temps dans un environnement multithread

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

2) redimensionner: L'ArrayList et le vecteur peuvent croître et rétrécir dynamiquement pour maintenir l'utilisation optimale de stockage, mais la façon dont ils redimensionné est différente. ArrayList augmente de moitié de sa taille lorsque redimensionné tandis que vecteur double la taille de lui-même par défaut quand se développe.

3) Performance: ArrayList donne de meilleures performances que c'est non synchronisée. Les opérations vectorielles donnent de mauvaises performances car elles sont thread-safe, le thread qui fonctionne sur le vecteur obtient un verrou sur celui-ci qui fait attendre d'autres thread jusqu'à ce que le verrou est libéré.

4) fail-fast: Permettez-moi D'abord d'expliquer ce qui est fail-fast: si la collection (ArrayList, vecteur etc) obtient structurellement modifié par n'importe quel moyen, sauf le add ou supprimer les méthodes de iterator,après la création d'iterator puis l'iterator lancera ConcurrentModificationException. Modification structurelle se réfère à l'ajout ou la suppression d'éléments de la collection.

selon le vecteur javadoc, le dénombrement retourné par le vecteur n'est pas rapide. De l'autre côté, l'itérateur et le listIterator retournés par ArrayList sont rapides.

5) qui fait vraiment partie du cadre de collecte? Le vecteur ne faisait pas partie de cadre de collecte, il a été inclus dans les collections plus tard. Il peut être considéré comme un code D'héritage. Il n'y a rien au sujet de Vector que la collecte de liste ne peut pas faire. Il convient donc d'éviter les vecteurs. S'il y a un besoin de fonctionnement sans fil font ArrayList synchronisé comme discuté dans la section suivante de ce post ou utilisez CopyOnWriteArrayList qui est une variante sans fil de ArrayList.

il y a peu de similitudes entre ces classes qui sont les suivants:

usage vectoriel et ArrayList growable array data structure . L'itérateur et le listiterateur retournés par ces classes (vecteur et ArrayList) sont fail-fast . Ils sont tous les deux des classes ordered collection car ils maintiennent l'ordre d'insertion des éléments. Vecteur & liste de tableaux à la fois allows duplicate and null values . Ils se développe et se rétrécit automatiquement lorsque le débordement et la suppression se produit.

8
répondu Nishat Lakhani 2016-02-15 06:35:13
  1. le vecteur est synchronisé par défaut, et ArrayList ne l'est pas. Remarque : vous peut rendre ArrayList également synchronisé en passant objet arraylist à Collection.synchronizedList() la méthode. Synchronisé signifie : il peut être utilisé avec plusieurs fils sans aucun effet secondaire.

  2. les ArrayLists croissent de 50% de la taille précédente lorsque l'espace n'est pas suffisant pour un nouvel élément, où comme vecteur croîtra de 100% de la précédent taille lorsqu'il n'y a pas de place pour un nouvel élément entrant.

1
répondu HeadAndTail 2018-02-13 13:55:21