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 :

iterator ou get ?


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut iterator ou get ?
    Je fais plein de parcours de listes (ArrayList pour la pluspart) et je me demande qu'elle est la methode la plus efficace (en temps), un Iterator ou des get en incrementant un indice de boucle ?

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout dépend du type de liste qur tu utilises

    Pour les ArrayList mieux vaut des get, par contre pour une LinkedList, mieux vaut un iterator par exemple.

  3. #3
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    voir doc de l'interface RandomAccess

  4. #4
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    Citation Envoyé par sinok
    Tout dépend du type de liste qur tu utilises

    Pour les ArrayList mieux vaut des get, par contre pour une LinkedList, mieux vaut un iterator par exemple.
    Euh si les mecs de chez Sun savent développer ils ont certainement fait une opération en O(1) pour la méthode next() de l'Iterator d'une ArrayList....

    Donc il vaut mieux utiliser iterator() pour le type List. Sachant que le gain en performance en utilisant get() sur un ArrayList est null (ou quasi).
    En fait je pense que l'opération next() de l'Iterator d'un ArrayList fait simplement un get() sur cette liste.

    [EDIT]
    Bon ben maintenant j'en suis sûr !
    Extrait de AbstractList.Itr.next() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                    Object obj = get(cursor);
                    lastRet = cursor++;
                    return obj;
    [/EDIT]

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    d'accord avec la remarque de Yann

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Mouaip sauf que sur l'arrayList il y a tout de même un une petite différence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
            ArrayList l = new ArrayList();
            for(int i =0; i<7000000; i++) {
                l.add(String.valueOf(i));
            }
     
     
     
     
            long start = System.currentTimeMillis();
            long end = System.currentTimeMillis();
     
     
            for (Iterator iter = l.iterator(); iter.hasNext();) {
                iter.next();
     
            }
            end = System.currentTimeMillis();
     
            System.out.println("temps iter: "+(end-start));
     
            start = System.currentTimeMillis();
            for(int i =0; i<l.size(); i++) {
                l.get(i);
            }
     
            end = System.currentTimeMillis();
            System.out.println("temps for: "+(end-start));
    Grosso modo le bout de code précédent me donne le résultat suivant:

    temps iter: 375
    temps for: 47
    (et si l'on inverse les calculs (cad le get avant l'iterator c'en est de même)

  7. #7
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    Resalut

    Un différence de 300 ms pour un parcours de 7 millions d'éléments c'est ce que j'appelle une différence quasi nulle. D'autant plus que si tuveux un jour changer ton type ArrayList en LinkedList, tu seras obliger de changer tous tes parcours de liste....

    Différence entre next() et get() = 300ms/7 000 000

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par yann2
    Euh si les mecs de chez Sun savent développer ils ont certainement fait une opération en O(1) pour la méthode next() de l'Iterator d'une ArrayList....
    Mais l'utilisation de l'Iterator rajoute une couche d'abstraction supplémentaire qui peut s'avérer un peu plus couteuse... et c'est le cas pour les ArrayLists par exemple.

    Toutefois cette différence est vraiment minime et ne se ressent que sur des liste de taille vraiment très importante...

    Attention cela ne veut pas dire qu'il faut privilégier l'accès via get(), car il peut se révéler catastrophique selon le type réel de la liste... Avec une LinkedList par exemple l'Iterator est nettement plus performant (et d'un ordre bien plus important encore) !


    Donc cela dépend de l'implémentation de la liste, et comme l'as dit professeur shadoko, l'interface RandomAccessList permet d'identifier la meilleure méthode à utiliser...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (list instanceof RandomAccessList) {
    	/* L'accès via get() dans un for() est potentiellement plus performant */
    } else {
    	/* L'accès via Iterator est plus performant */
    }
    a++

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

Discussions similaires

  1. Iteration VS recursivité
    Par yacinechaouche dans le forum C
    Réponses: 40
    Dernier message: 16/11/2012, 11h52
  2. Iterator d'une liste - get qui marche pas
    Par docky dans le forum C++
    Réponses: 4
    Dernier message: 25/05/2008, 17h04
  3. url d'une page asp ou upload avec get
    Par taupin dans le forum ASP
    Réponses: 18
    Dernier message: 22/08/2003, 14h25
  4. [debutant]iterator
    Par Wis dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 05/05/2003, 10h49
  5. vInt::iterator
    Par Monstros Velu dans le forum C++
    Réponses: 19
    Dernier message: 05/04/2003, 15h06

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