IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Différence entre ArrayList et Vector


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Par défaut Différence entre ArrayList et Vector
    Bonjour,

    Je voulais savoir la différence entre un ArrayList et un Vector: En effet j'ai trouvé ce tableau comparatif:


    Alors je me suis posé la question: les méthodes dans un Vector sont synchronized, est ce que ca veut dire que un seul thread peut accèder à un Vector? et qui entre le ArrayList et le Vector favorise le multithreading?

    Merci d'avance!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par L'aigle de Carthage Voir le message
    Alors je me suis posé la question: les méthodes dans un Vector sont synchronized, est ce que ca veut dire que un seul thread peut accèder à un Vector? et qui entre le ArrayList et le Vector favorise le multithreading?
    On peut accèder à une instance d'ArrayList, aussi bien qu'une instance de Vector, à partir d'autant de threads que l'on veut. Mais, dans le cas de l'ArrayList, si plusieurs threads y accèdent en faisant des opérations qui peuvent entrer en conflit (comme par exemple un qui ajoute un élément, et l'autre qui en enlève, ou qui ne fait que parcourir la liste d'éléments), il y aura une erreur, ou au mieux un résultat incohérent, parce que aucune opération n'est atomique, mais composée de plusieurs instructions. Dans le cas d'accès par plusieurs threads, l'ensemble des instructions nécessaires à l'achèvement d'une opération pourra ne pas avoir été exécutées, donc l'autre opération va chercher à faire quelque chose avec un état intermédiaire de la collection, incohérent, ce qui donnera n'importe quoi.

    Mais les différents threads ne font que lire des données dans l'ArrayList, ça ne pose aucun problème. Dans le cas du Vector, à cause de la synchronisation, l'accès par 2 threads fera que l'un devra attendre que l'autre ait terminé avant de pouvoir faire l'opération, pour toutes les opération, y compris si c'est en lecture uniquement. Donc introduire éventuellement des petits ralentissements : c'est pourquoi, lorsqu'on sait qu'on ne fera jamais d'accès concurrents, ou lorsque c'est impossible d'en faire (variable locale), il vaut mieux utiliser une ArrayList. Personnellement, je n'utilise que ArrayList, et quand j'ai besoin d'accès multithread concurrent, soit j'utilise synchronized (lorsque l'ArrayList est un attribut d'une classe en particulier), soit j'utilise Collections.synchronizedList(liste)). Je n'utilise donc jamais Vector.

    A noter que les parcourts par Iterator sont protégés par l'intermédiaire d'une ConcurrentModificationException, pour les 2 classes, à cause du conflit qu'il peut y avoir à chercher à accèder à un élément dans une liste qu'on est entrain de modifier par ailleurs. Pour éviter le conflit, on synchronize tout le bloc d'itération sur l'instance de ArrayList ou Vector. Pour minimiser le blocage de la collection pour un autre thread, on peut faire une simple copie dans une première itération (ou par un synchronized(liste){ copy = new ArrayList<>(liste);}, puis en dehors du bloc synchronisé, on parcourir parcourir la copie (qui ne sera pas influencée par les modifications sur la liste/vecteur d'origine).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Différence entre LinkedList et ArrayList ?
    Par van der zahir dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 21/09/2011, 02h12
  2. [Liste] Différence entre LinkedList et ArrayList ?
    Par wafiwafi dans le forum Collection et Stream
    Réponses: 25
    Dernier message: 30/01/2011, 14h16
  3. Différence entre Vector et ArrayList
    Par menzlitsh dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/03/2009, 14h32
  4. Différence entre array arraylist ?
    Par sauceaupistou dans le forum Framework .NET
    Réponses: 7
    Dernier message: 28/03/2008, 22h01
  5. Différences entre ArrayList et Vector
    Par lionrouge dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 29/05/2006, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo