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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 901
    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 901
    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

+ 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. 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