CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] for et les Arraylist

Arkwolf
Arkwolf
Niveau 29
23 février 2011 à 12:28:15

:salut:

Alors voilà j'me pose une question importante en java :(

Jusqu'à maintenant, pour parcourir mes objets dans les Arraylist, je faisais tout le temps :

for (Objet o : liste l)
if (o.estLeBonObjet()){
faire un truc();
break;
}

mais mon prof m'a dit que c'était super mal de faire ça, et qu'il fallait plutôt faire :

int i=0;
while(i<liste.size()){
if (liste.get(i).estLeBonObjet()){
faire un truc;
break;
}
i++;
}

en me disant que c'était beaucoup plus optimisé et rapide.

mais je comprend pas pourquoi, pour moi ça revient exactement au même :(

Il m'a dit que la première méthode forçait la liste à être parcourue entièrement, c'est vrai :question:

comment ça marche ce for en fait du coup :doute:

_skip
_skip
Niveau 10
23 février 2011 à 13:14:02

Non, pour moi c'est n'importe quoi.

Le "for each" est basé sur un Iterator fail-fast en interne et c'est la façon la plus propre d'itérer une collection (pas forcément une liste).

L'exemple avec while est d'autant plus maladroit qu'on aurait pu utiliser la syntaxe

for(int i = 0; i < liste.size(); i++)
{}

plus élégante mais déjà plus moche que l'iterator. D'un point de vue pratique pour une VM, une construction "for( : )" est facile à optimiser (désactivation des bounds checking et tout ça).

Bref c'est un faux débat de toutes façons car si on souhaitait faire de la recherche dans une liste en prenant vraiment en compte la vitesse, y'aurait des systèmes beaucoup plus rapides qu'une itération.

Arkwolf
Arkwolf
Niveau 29
23 février 2011 à 13:39:22

Okay, ça confirme ce que je pensais :(

:merci:

Bunyan
Bunyan
Niveau 17
23 février 2011 à 15:01:01

Je pense que tu pourrais aussi te renseigner sur les "Generics" (types génériques).

Ca te permettra de te passer du test de type dans le cas de Collections homogène.

_skip
_skip
Niveau 10
23 février 2011 à 16:37:31

C'est juste mais ça c'est plus une question de sécurité parce que les génériques en java sont perdus à la compilation (type erasure).
Dans C# en revanche, les génériques sont conservés et utilisés pour des optimisations en plus d'être carrément supérieurs en terme de possibilités. Rétrocompatibilité quand tu nous tiens.

Bunyan
Bunyan
Niveau 17
23 février 2011 à 23:08:50

Vi, mais ça lui permettrai de virer le fait qu'il s'amuse avec des "Object" :)
C'est principalement pour ça en fait.

Arkwolf
Arkwolf
Niveau 29
24 février 2011 à 12:29:05

J'ai essayé de créer une Arraylist de points, de parcourir cette liste et en suite d'afficher le temps que ça mettait, et finalement avec la méthode de mon prof ça va environ 100 fois plus vite qu'avec un for each :doute:

J'suis surpris mais il avait raison, je suppose :(

Paulop
Paulop
Niveau 12
24 février 2011 à 13:30:49

Hum, à mon avis ça dépend de ce que tu fais dans ta boucle.
Peut être que le compilateur optimise la boucle while bien mieux que le foreach dans ce cas précis. Ou bien que ta JVM a un comportement trivial.

Par contre fait gaffe, ArrayList implémente ça : http://download.oracle.com/javase/1.4.2/docs/api/java/util/RandomAccess.html
Mais pas les autres, donc il se peut que le foreach soit une bien meilleure pratique, histoire de ne pas se retrouver avec un réel problème de performance.

Le mieux c'est de profiler le code et de chercher la meilleure façon d'itérer une fois que tu as terminé ton application. :-)))

acemicka
acemicka
Niveau 9
24 février 2011 à 14:13:27

ba disons que toi tu as une affectation et lui non apparament.
A chaque fois tu met l'objet de la liste dans un Objet o.

godrik
godrik
Niveau 30
24 février 2011 à 19:26:47

java peut avoir des performances tres tres etrange. Je conseillerais de ne pas se preoccuper des performance trop tot dans le developpement de l'application et de voir a la fin ce qui prend du temps et si ca vaut le coup de se faire chier.

De facon general, si le langage a une construction dedie pour une operation, il est preferable de l'utiliser. Elle sera certainement optimiser plus tard dans le developpement du compilateur (ou machine virtuelle)

Arkwolf
Arkwolf
Niveau 29
24 février 2011 à 20:11:19

Wokay, intéressant, :merci:

_skip
_skip
Niveau 10
26 février 2011 à 10:49:07

Attends, c'est quoi 100 fois plus vite? Mesurée comment?
Parce qu'il faut se méfier des microbenchmarks, et surtout faire attention au fait que le code java s'optimise au fur et à mesure et il se peut tout à fait que la méthode foreach ait nécessité de JITer des classes jusque là inutiles.

Poste le code de ton test et on pourra en reparler. Car selon "Effective java" que je possède, un foreach a des chances d'être plus rapide qu'un for.

Arkwolf
Arkwolf
Niveau 29
03 mars 2011 à 11:50:07

:salut:

Désolé pour le retard :noel:

J'avais fait un truc comme ça :
http://www.copypastecode.com/65155/

et même en inversant les deux boucles ça revenait au même donc j'en ai conclu que le for each était moins rapide pour ce cas là :doute:

_skip
_skip
Niveau 10
03 mars 2011 à 12:12:45

Flemme de tester mais si tu fais ça, normalement tes boucles tournent même pas 1 seul tour.

Arkwolf
Arkwolf
Niveau 29
03 mars 2011 à 12:27:29

Ah bon ? :doute:
Il les supprime tout seul parce que rien est véritablement fait dedans ?

Dans ce cas pourquoi y'a quand même une sacrée différence de temps ? :(

Arkwolf
Arkwolf
Niveau 29
03 mars 2011 à 12:30:54

Même en faisant des opérations
http://www.copypastecode.com/65163/
le résultat est le même :doutoe:

_skip
_skip
Niveau 10
03 mars 2011 à 13:36:07

Déjà il y a un truc valable pour tous les langages JIT : tu peux jamais te fier à la première exécution d'un algo pour juger de son temps sans warmup.

Ensuite par rapport à ton code, fait un system.out.println de arraylist.size() pour voir de quoi je parle.

Arkwolf
Arkwolf
Niveau 29
03 mars 2011 à 13:44:25

:gne:

On peut m'expliquer pourquoi les listes sont vides ? :fou:

_skip
_skip
Niveau 10
03 mars 2011 à 14:27:16

Parce que size() c'est pas la capacité actuelle de la liste mais bel et bien le nombre d'objets contenu. Or quand tu viens juste de la créer, ce nombre c'est 0.

Donc une boucle
for(int i = 0; i < 0; i++)

Ca tourne pas longtemps.

Arkwolf
Arkwolf
Niveau 29
03 mars 2011 à 14:42:36

Mince, j'me suis foutu la honte là :mort:
Merci

Ouais du coup maintenant la boucle la plus lente est celle qui démarre en premier à cause de ce fameux warm up j'imagine :noel:

Donc pour parcourir une liste entièrement vaut mieux toujours utiliser un for each (en plus si on change de type de collection ça marchera toujours rapidement) plutôt que d'utiliser un for / while qui est moins lisible et qui va au final aussi vite :(

C'était intéressant :oui:

:merci:

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment