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 :

La fin du For et des ArrayList d'objets ?


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut La fin du For et des ArrayList d'objets ?
    Bonsoir à tous,

    je parcourais le forum java comme à mon habitude, lorsque par mégarde je tombe 2 fois de suite sur des sujets contenant les codes de java 5.0 Tiger (generics) avec des ArrayList<String> , et des for(String: ArrayList) et j'en passe et des pires.

    Un effroi me parcours soudainement la peau du dos :
    Est-on condamné à ne plus voir de bonne vieille boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0;i < maListe.size(); i++)
    {}
    et nos bons vieux Vector ou ArrayList non pré-typé ??
    Suis-je le seul à ne rien comprendre quand je lis les "nouvelles" syntaxes ?


    Help !
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  2. #2
    Nouveau membre du Club Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    C'est vrai que ça fait bizar, mais après tout je trouve ça pas mal.

    Moi j'utilise énormement les ArrayList, pas les Vectors, et c'est vrai que de leur ajouter un typage ça peut ajouter pas mal de propreté et de sureté au code (pas de castage a faire etc...)
    Et puis le plus souvent on parcout l'intégralité d'un liste donc for(String: ArrayList) ça à l'air pas mal non ? si ça vaut bien dire : "parcourir tout la liste et en faire des String"
    Horloge : machine de grande morale pour l’Homme, lui rappelant sans cesse qu’il lui reste un peu de temps à vivre.

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut, perso je trouve ca cool, ca évite le cast et les Exception de transtypage. Par contre j'avais fait quelques tests de rapidités :

    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
      List<Integer> list = new ArrayList(8888888);
            for(Integer l = 0; l < 8888888; l++) {
                list.add(l);
            }
     
            long sTime2 = System.currentTimeMillis();
            for (Integer l : list) { ; }
            System.out.println("for étendue: " + (System.currentTimeMillis() - sTime2));
     
            long sTime5 = System.currentTimeMillis();
            for (Integer l = 0; l < 8888888; l++) { ; }
            System.out.println("Taille en dur: " + (System.currentTimeMillis() - sTime5));
     
            long sTime6 = System.currentTimeMillis();
            for (Integer l = 0; l < list.size(); l++) { ; }
            System.out.println("list.size(): " + (System.currentTimeMillis() - sTime6));
    Je sais pas si ces tests sont très significatifs mais le for étendue prenait tjrs plus de temps...
    Bye ^^
    Vive les roues en pierre

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par Regis.C
    Un effroi me parcours soudainement la peau du dos :
    Est-on condamné à ne plus voir de bonne vieille boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0;i < maListe.size(); i++)
    {}
    et nos bons vieux Vector ou ArrayList non pré-typé ??

    Help !
    Relax
    Personnellement je trouve ces nouvelles fonctionnalités vraiment très pratiques. En effet pouvoir simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List list = new ArrayList();
    //  ....
    for(int i = 0; i < list.size(); i ++) {
         String string = (String) list.get(i);
          System.out.println(string);
    }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<String> list = new ArrayList<String>();
    //  ....
    for(String string : list) {
         System.out.println(string);
    }
    est vraiment très pratique autant en économie de code (for) qu'en sécurité du code (générics).
    Cependant je ne pense pas que les "anciennes" boucles for disparaitront étant donné que l'on a parfois besoin de l'index dans le traitement (la variable i est donc nécessaire).

    Suis-je le seul à ne rien comprendre quand je lis les "nouvelles" syntaxes ?
    Je suppose que tu parle notamment de la syntaxe du nouveau for qui est, il est vrai, pas très explicite mais on s'y fait vite (en tout cas moi je l'utilise dès que j'en ai l'occasion ).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par Djakisback
    Je sais pas si ces tests sont très significatifs mais le for étendue prenait tjrs plus de temps...
    Bye ^^
    Non ces test ne sont pas significatifs, modifie l'ordre des boucles et tu veras que le première est toujours plus longue .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Disons que s'ils l'avaient appelé foreach au lieu de for cela aurait été plus clair pour tout le monde.
    Je n'ai pas trop regardé le bytecode généré mais j'imagine très bien que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Truc truc : trucList) {
      ...
    }
    doit donner une fois compilé, un bytecode à 90~100% similaire à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator<Truc> it = trucList.iterator() ; it.hasNext() ; ) {
      Truc truc = it.next();
       ...
    }
    ou (pour les versions pre 1.5) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator it = trucList.iterator() ; it.hasNext() ; ) {
      Truc truc = (Truc)it.next();
       ...
    }
    Donc à priori (à vérifier) il y a au moins création d'un objet au départ et appel de deux méthodes à chque itération par rapport à une boucle classique (mais bon il faut quand même allouer un entier pour stocker l'index sans parler des vérifications de bornes). Mais ca ne devrait pas être une source de trop gros ralentissements.
    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

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Bin en fait j'avais mis une quinzaine de boucles (d'où les sTime1, 2, 3, etc.) et mélangé l'ordre des traitements plusieurs fois et le for étendue était toujours le plus long. Le plus court était pratiquement tout le temps la taille en dur, quelque soit l'ordre. D'ailleurs ca m'a étonné, size() ne fait pas juste retourner un int stocké ? enfin j'en ai conclu que size() recalculait à chaque fois la taille. Mais bon, je dérive du post, désolé ^^
    Vive les roues en pierre

  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 : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par bouye
    Disons que s'ils l'avaient appelé foreach au lieu de for cela aurait été plus clair pour tout le monde.
    Cela aurait été plus clair en effet... Tout cela pour ne pas ajouter un nouveau mot*clef...

    Citation Envoyé par bouye
    doit donner une fois compilé, un bytecode à 90~100% similaire à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator<Truc> it = trucList.iterator() ; it.hasNext() ; ) {
      Truc truc = it.next();
       ...
    }
    Oui il y a de forte chance (sauf pour les tableaux "standard" où il doit y avoir un accès par index). D'ailleurs les boucles "foreach" fonctionnent avec n'importe quel classe qui implémente la nouvelle interface Iterable qui définit la méthode iterator()...


    Citation Envoyé par bouye
    Mais ca ne devrait pas être une source de trop gros ralentissements.
    Cela dépend de l'implémentation. En terme de performance, l'Iterator (et donc la boucle "foreach") est un bon compromis pour le parcours des collections, en laissant l'implémentation du parcours à la charge de la classe collection...

    En effet, même si un parcours par index est bien plus performant sur un Vector ou une ArrayList qu'un Iterator, il peut être catastrophique sur une LinkedList, car on peut avoir à parcourir un grand nombre d'élément avant d'arriver à l'index souhaité...

    Si on a vraiment besoin de grosse performance, on peut utiliser l'interface marqueur RamdomAccess qui indique qu'on peut accéder rapidement aux index de la liste, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List<String> list = ...
     
    if (list instanceof RandomAccess) {
        /* Le parcours direct par index est plus performant */
        for (int i=0; i<list.size(); i++) {
            String s = list.get(i);
            ...
        }
    } else {
        /* Le parcours par Iterator est plus rapide */
        for (String s : list) {
            ...
        }
    }
    Citation Envoyé par Djakisback
    enfin j'en ai conclu que size() recalculait à chaque fois la taille. Mais bon, je dérive du post, désolé ^^
    Je pense plutôt que c'est l'appel de méthode qui est couteux. On peut optimiser cela en copiant la taille dans une variable locale....


    Toutefois dans la plupart des cas la différence entre un parcours via index ou via itérator est bien minime... Il est donc préférable de passer via le foreach si pratique

    a++

  9. #9
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par Regis.C
    Bonsoir à tous,

    je parcourais le forum java comme à mon habitude, lorsque par mégarde je tombe 2 fois de suite sur des sujets contenant les codes de java 5.0 Tiger (generics) avec des ArrayList<String> , et des for(String: ArrayList) et j'en passe et des pires.

    Un effroi me parcours soudainement la peau du dos :
    Est-on condamné à ne plus voir de bonne vieille boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0;i < maListe.size(); i++)
    {}
    et nos bons vieux Vector ou ArrayList non pré-typé ??
    Salut,

    Rien ne t'empeche en fait d'utiliser la version "classique" du for, et ce meme en 5.0. Le seul problème est que si l'on te donne un tourne-vis éléctrique, pourquoi continuer à tourner à la main ?

    Pour moi, java 5.0 apporte, malgré le mot clé foreach qui aurait été préférable, une énorme dose de simplicité et de compréhension. De plus, il apporte une façon d'avoir des collections typées, et donc de ne plus se tromper dans des casts rébarbatifs, rebutants et très lourds dans leur écriture.

    Citation Envoyé par Regis.C
    Suis-je le seul à ne rien comprendre quand je lis les "nouvelles" syntaxes ?


    Help !
    Eh bien écoute, c'est vrai qu'au début ca peut parraitre déroutant, surtout quand tu viens d'un langage comme le C++ ...
    Mais, comme dit la pub, L'essayer, c'est l'adopter.

    Bien à vous

    mavina
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  10. #10
    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 : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Pour vous familiarisez avec Java 5.0, vous pouvez toujours jeter un coup d'oeil sur la présentation de Lionel Roux : Tiger: la révolution de Java 5

    a++

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par mavina
    Eh bien écoute, c'est vrai qu'au début ca peut parraitre déroutant, surtout quand tu viens d'un langage comme le C++ ...
    Suis pas d'accord meme si c'est vrai que cela depend de quelle version de C++ tu parles.

    La syntaxe des Collections + Generics est quand meme relativement similaire a celle de la STL + templates y compris au niveau des boucles sur les iterator. Le foreach est un peu a part mais une fois qu'on a compris qu'il ne s'agit que de sucre syntaxique pour cacher une manipulation d'iterateur (ou quelques chose d'equivalent)...

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <list>
    #include "Truc.h"
     
    using std;
     
    list<Truc&> trucList;
    ...
    for (list<Truc&>::iterator it = trucList.begin(); it != trucList.end() ; it++) {
      Truc &truc = *it;
      ...
    }
    ou un truc du genre en esperant ne pas trop avoir ecrit de betises, mon C++ etant plutot rouille ces temps-ci.
    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

  12. #12
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    moui je suis pas spécialiste du C++, et personnellement je trouve plus accessible le foreach de Java que celui de C++, rien qu'au niveau de l'écriture...
    Ton truc me fait froid dans le dos

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  13. #13
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Citation Envoyé par mavina
    moui je suis pas spécialiste du C++, et personnellement je trouve plus accessible le []foreach[/i] de Java que celui de C++, rien qu'au niveau de l'écriture...
    Ton truc me fait froid dans le dos

    Fred
    Je te rassure mavina, j'ai quelques notions en C++ et cela me fait le même effet !!
    VIVE JAVA, MORT AU ROI !!!..heu....pardon, un moment d'égarement.
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 25
    Points : 26
    Points
    26
    Par défaut
    Le for classique est tjs utile lorsqu'on a besoin de l'indice:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int[] tab1={1,2,3};
    int[] tab2=new int[tab1.length];
     
    for(int i=0; i<tab1.length; i++){
       tab2[i]=traitementAPartirDe(tab1[i]);
    }

Discussions similaires

  1. comparer des ArrayList d'objets
    Par Empty_body dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/01/2007, 08h26
  2. en fin d'apprentisage avec des petits problemes!
    Par nanon dans le forum Droit du travail
    Réponses: 19
    Dernier message: 04/09/2006, 12h01
  3. Tri des ArrayList
    Par L4BiN dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 04/07/2006, 14h00
  4. Réponses: 4
    Dernier message: 03/07/2006, 01h30
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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