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 :

[Liste] Différence entre LinkedList et ArrayList ?


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut [Liste] Différence entre LinkedList et ArrayList ?
    Bonjour,
    On utilise souvent les deux structures LinkedList (liste chainée)et arraylist tableau dynamique.
    Question:
    Y a t il vraiment une différence entre ces dernières puisque de toute façon, rien n'est garanti quant à la contiguïté des données en mémoire. La JVM fait à sa sauce! En plus n'oublions pas la plateforme sur laquelle tourne la JVM; elle met sa couche de gestion de la mémoire.

    merci à vous

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    La différence se situe surtout au niveau de la façon dont tu dois accéder à tes données.

    Une ArrayList est gérée en interne par un tableau. On peut donc accéder en temps constant à n'importe quel élément par "monArrayList.get(nb);".

    Avec une LinkedList, une telle commande est catastrophique en termes de performances (il faut passer par les nb-1 premiers éléments pour accéder au nb-ième).
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    Merci pour ta réponse.
    Une ArrayList est gérée en interne par un tableau. On peut donc accéder en temps constant à n'importe quel élément par "monArrayList.get(nb);".
    J'ai toujours appris qu'une liste est en accès séquentiel.
    Il s'agit bien d'une liste?
    Je pensais que la différence venait de la contiguïté des données.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 905
    Billets dans le blog
    54
    Par défaut
    Si les donnees ne sont justement pas contigues, il faut prendre en compte le temps d'acces a l'addresse / decallage memoire pour chacun des elements precedents qui vient justement s'ajouter en cas d'acces direct a l'element n.

    Dans les faits :
    • Une ArrayList est adaptee aux acces directs et aux listes de taille fixe. Elle peut devenir un trou de performance dans le cas ou la capacite de la liste varie brutalement et rapidement dans le temps (ce qui implique de multiple allocations / recopies de tableaux).
    • Une LinkedList est adaptee aux listes de taille dynamique avec ajout/retrait en debut ou fin de liste ou via une position pointee par un iterateur (et non un indice). Elle peut devenir un trou de performance en cas d'un nombre important d'acces directs via des indices (encore plus si la liste est grande).


    En theorie le parcours via iterateur devrait etre un poil plus rapide sur une ArrayList que sur une LinkedList de par sa structure contigue.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par wafiwafi Voir le message
    J'ai toujours appris qu'une liste est en accès séquentiel.
    Il s'agit bien d'une liste?
    Une liste est une séquence de choses dont l'ordre ne change pas sans qu'on lui demande.
    Son accès peut être séquentiel ou aléatoire selon les besoins.
    Toutefois, si on a besoin de la parcourir séquentiellement, il faut le faire explicitement avec un itérateur, plutôt que de faire une boucle d'accès aléatoires. Parce que si une ArrayList le supporterait bien, en revanche ça plairait pas du tout à une LinkedList.

    Citation Envoyé par wafiwafi Voir le message
    Je pensais que la différence venait de la contiguïté des données.
    Cela n'est qu'une conséquence implicite de leurs différences. La différence, c'est que l'une stocke dans un tableau, l'autre maintient une chaîne de références.

    Et il s'agit plus de données stockées dans le même tableau, qu'une garantie système de l'utilisation exacte de la mémoire physique. Effectivement, ce genre d'économie de bouts de ficelles est rarement imposable à Java : la JVM sait organiser un tableau, merci bien.
    Il existe des cas plus réels où la JVM n'est pas en mesure de choisir la bonne solution, auquel cas, en effet, ça devient compliqué. Dans ce cas-là, ou bien Java fournit des APIs à employer, ou bien il devient nécessaire de développer les siennes en JNI.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    Voila ce que j'en déduis :
    ArrayList est un tableau; l'accès est donc aléatoire.
    LinkedList est une liste chainée; l'accès se fait par un itération.

    Par contre, une chose me dérange ou du moins reste ambiguë pour moi :
    C'est le cas d'une liste dont les emplacements sont contigües. L'accès dans ce cas peut être aléatoire ou par itération. Or, dans la définition d'une liste (que j'ai vue dans plusieurs documents et livres) et surtout quand on la compare à un tableau, on lui attribue de suite l'aspect séquentiel des accès, ce qui rentre en contradiction avec ce qui précède si on considère que ArrayList est une liste.
    Tout ces ouvrages font il allusion à la liste chainée? ou je me trompe?
    Merci à vous

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mais ça c'est très abstrait comme considération, et pas particulièrement lié aux nomenclatures choisies par un langage précis.

    En Java, List est simplement une interface, qui étend l'interface Collection.
    Une Collection, c'est un machin qui contient des objets, éventuellement en respectant des règles sur la manière de les organiser, l'ordre dans lequel les rendre ou ce genre de choses.
    Une List, donc, est aussi un machin qui contient des objets. Mais en plus, qui conserve l'ordre dans lequel on les lui ajoute, et qui propose d'aller regarder/remplacer/enlever/insérer-un-autre-objet-avant celui qui se trouve en i-ième position.

    Et ça, il y a grosso-modo deux manières de le faire :
    - En stockant dans un tableau, qu'on redimensionne au besoin, et en décalant tout le contenu à chaque suppression/insertion. C'est l'implémentation ArrayList de List.
    L'intérêt par rapport à "juste un tableau" c'est que le tableau, il ne se redimensionne pas tout seul et il ne décale rien du tout, bref il ne fait pas ce que l'interface List dit qu'elle fait. C'est utile, pourtant.
    - En maintenant une chaîne de références, qu'il va donc falloir se taper chaque fois qu'on veut regarder la position i et pas une autre. C'est l'implémentation LinkedList.

    En Java c'est ça que le type List, une interface, est. Elle n'est pas un concept plus abstrait qu'on nomme liste dans les discussions théoriques. En Java, ce concept abstrait se limiterait plutôt à la LinkedList.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    c'est très clair.
    Pas de confusions; les choses sont bien à leurs places.
    Merci à toi

  9. #9
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    Bonjour,
    Si List est une interface alors ses méthodes sont vides. Dans ce cas tout ce qui hérite de List implémentent les méthodes.
    Est ce que Liste est déclarée comme interface pour habituellement jouir du polymorphisme ou il y a une autre raison (que je ne vois d'ailleurs pas)?. Puisqu'il y a héritage, pourquoi n'a t on pas simplement déclaré List comme une classe mère abstraite avec des implémentations par défaut des méthodes de List. Est ce pour éviter l'héritage multiple?
    Pour résumer et être clair, la question est :
    Pourquoi List est déclarée comme une interface?
    Merci à vous

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    une List n'est pas une classe parce que
    -> il n'y a aucun code par défaut associé (quel serait dont alors l'intérêt d'en faire une classe)
    -> Ca empecherait n'importe qui d'etre une liste, car on serait obligé d'étendre la classe mère (hors ce n'est pas nécessairement le cas).

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ça n'empêcherait pas vraiment... Disons que ce serait moins propre à faire, de une, parce que toute implémentation de liste devrait être sous-classe d'une classe dont elle redéfinit absolument tout. De deux, ça limiterait beaucoup les possibilités de polymorphisme, parce qu'une classe peut implémenter autant d'interfaces qu'elle veut, mais étendre une seule classe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    C'est bien ce que je pensais; c'est une question d'héritage multiple que supporte le concept interface.
    Merci à vous.

  13. #13
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par wafiwafi Voir le message
    Puisqu'il y a héritage, pourquoi n'a t on pas simplement déclaré List comme une classe mère abstraite avec des implémentations par défaut des méthodes de List. Est ce pour éviter l'héritage multiple?
    Mais ça a été fait. Si List est une interface, l'API de Java contient également une classe abstraite AbstractList.

    Cette classe abstraite implémente l'interface List, et définit un certain nombre de méthodes de la classe.

    Ainsi, pour accélérer le développement d'une liste concrète, on peut implémenter List... et étendre AbstractList (dans ce cas, implémenter List est d'ailleurs redondant).

    C'est d'ailleurs ce qui se passe pour les classes de l'API : ArrayList et LinkedList étendent toutes les deux la classe AbstractList.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    vos explications sont limpides !

    je voulais poser la question sur la différence entre ArrayList et Vector à partir de la version 1.5 ?

  15. #15
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Vector est synchronisée, et pas ArrayList.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    hmmm on m'a deja repondu ca !

    sauf que je ne sais pas ce que cela veut dire synchronisé.....

  17. #17
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ça veut dire que toutes les méthodes de Vector ont le modificateur synchronized. Plus qu'à potasser ce mot-clé.

    Pour faire simple, ça veut dire que plusieurs threads peuvent se permettre de lire et d'écrire dans un même Vector en même temps : normalement il y aurait risque que des écritures simultanées mettent l'objet dans un état incohérent, mais les méthodes étant synchronized, un seul thread n'y accède à la fois, les autres attendant que l'accès se libère.

    Le mécanisme de synchronisation a un coût, et il est inutile de payer ce coût quand un seul thread utilise la collection. Par conséquent, On ne veut pas toujours un Vector.

    (À noter qu'on peut obtenir une List synchronisée avec Collections.synchronizedList(). Vector serait un raccourci, et ressemble aussi un peu à une classe obsolète, vestige d'une ancienne façon de voir.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    qu'il y a du code pour garantir qu'on puisse utiliser de manière concurrente depuis plusieurs thread, mais ca implique que c'est plus lent

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    merci chapeau bas, vos explications sont de nouveau limpides !

  20. #20
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    merci pour tous vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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. Différence entre Vector et ArrayList
    Par menzlitsh dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/03/2009, 14h32
  3. [List] différence entre empty et null
    Par kaljerhom dans le forum Langage
    Réponses: 1
    Dernier message: 08/12/2008, 10h41
  4. la différence entre élement liste et une lov
    Par rara_rara dans le forum Oracle
    Réponses: 2
    Dernier message: 04/10/2006, 10h25
  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