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

java.util Java Discussion :

iterator ou get ?


Sujet :

java.util Java

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    juin 2004
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    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 : 165
    Points : 116
    Points
    116
    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 éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 765
    Points : 12 920
    Points
    12 920
    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.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 152
    Points : 1 626
    Points
    1 626
    Par défaut
    voir doc de l'interface RandomAccess
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (un peu de pub pour mon site: http://scrountch.info/java )

  4. #4
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2004
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : mai 2004
    Messages : 896
    Points : 1 600
    Points
    1 600
    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 expérimenté
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    juillet 2006
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 152
    Points : 1 626
    Points
    1 626
    Par défaut
    d'accord avec la remarque de Yann
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (un peu de pub pour mon site: http://scrountch.info/java )

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

    Informations forums :
    Inscription : août 2004
    Messages : 8 765
    Points : 12 920
    Points
    12 920
    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)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2004
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : mai 2004
    Messages : 896
    Points : 1 600
    Points
    1 600
    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 sénior
    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
    Points : 22 993
    Points
    22 993
    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, 12h52
  2. Iterator d'une liste - get qui marche pas
    Par docky dans le forum C++
    Réponses: 4
    Dernier message: 25/05/2008, 18h04
  3. url d'une page asp ou upload avec get
    Par taupin dans le forum ASP
    Réponses: 18
    Dernier message: 22/08/2003, 15h25
  4. [debutant]iterator
    Par Wis dans le forum java.util
    Réponses: 3
    Dernier message: 05/05/2003, 11h49
  5. vInt::iterator
    Par Monstros Velu dans le forum C++
    Réponses: 19
    Dernier message: 05/04/2003, 16h06

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