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] ArrayList vs Tableau, match à mort !

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 18:33:10

Salut, étant débutant en Java j'ai voulu comparer les ArrayList et les tableaux. Pour ça j'ai construit un tableau et une ArrayList des n premiers nombres (1,2,3,...,n) et j'ai fait la somme par 2 méthodes différentes. J'ai calculé le temps que ça me prend lorsque je passe un très grand nombre en paramètre https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Le code pour ceux qui veulent (je rappelle que je débute) :
https://pastebin.com/Kkn645nA

Et bordel regardez moi cette différence de temps de calcul pour la somme des 10 000 000 premiers entiers :ouch:

Somme Tableau -> 0.016 secondes
Somme ArrayList -> 2.594 secondes

Comment expliquer ça ?

Message édité le 06 janvier 2018 à 18:35:46 par Capitainerie
Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 18:34:43

Et d'ailleurs c'est jamais le même temps de calcul quand je compile, je comprends pas pourquoi non plus https://image.noelshack.com/fichiers/2016/30/1469541952-risitas182.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 18:49:47

https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Blaff11
Blaff11
Niveau 10
06 janvier 2018 à 18:52:32

ArrayList ça doit être une linked list, tableau ça doit être une list continue en mémoire. https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Essaye maintenant d'insérer 10 000 000 fois un élément au milieu de ton tableau et compare.
Je dirais que le ArrayList est plus rapide en moyenne que le tableau.

PS: J'y connais rien en Java, juste des hypothèses sur les structures de données classiques.

Message édité le 06 janvier 2018 à 18:53:18 par Blaff11
Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 18:55:13

Le 06 janvier 2018 à 18:52:32 Blaff11 a écrit :
ArrayList ça doit être une linked list, tableau ça doit être une list continue en mémoire. https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Essaye maintenant d'insérer 10 000 000 fois un élément au milieu de ton tableau et compare.
Je dirais que le ArrayList est plus rapide en moyenne que le tableau.

PS: J'y connais rien en Java, juste des hypothèses sur les structures de données classiques.

Il y a aussi un objet LinkedList en Java, mais quand je teste de faire la somme de cette LinkedList au lieu de l'ArrayList ça me double le temps de calcul https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Mais je vais essayer ton truc, ça a l'air marrant https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

TechnoBoomBoom
TechnoBoomBoom
Niveau 6
06 janvier 2018 à 18:56:54

Les tableaux sont bcp plus rapide car bas niveaux mais il faut + gerer sa memoire car elle est "fixe"
Quand tu crées un tableau tu dois mettre une taille

Message édité le 06 janvier 2018 à 18:57:20 par TechnoBoomBoom
TechnoBoomBoom
TechnoBoomBoom
Niveau 6
06 janvier 2018 à 18:58:56

BTW, y'a des fonctions qui existent pour avoir la taille ton arraylist et de ton tab

Wewerehappy
Wewerehappy
Niveau 53
06 janvier 2018 à 18:59:16

Le temps de calcul different c'est normal je pense à cause de la répartition des taches sur le proco

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:06:42

Le 06 janvier 2018 à 18:58:56 TechnoBoomBoom a écrit :
BTW, y'a des fonctions qui existent pour avoir la taille ton arraylist et de ton tab

Oui pour la taille du tab c'est truc.lenght et pour l'ArrayList c'est truc.size(), mais je les utilise dans mon code pour calculer les sommes https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:07:40

Le 06 janvier 2018 à 18:56:54 TechnoBoomBoom a écrit :
Les tableaux sont bcp plus rapide car bas niveaux mais il faut + gerer sa memoire car elle est "fixe"
Quand tu crées un tableau tu dois mettre une taille

Ok merci pour ta réponse, mais je construit mon tableau avec la taille que je mets en paramètre de ma méthode.

Le 06 janvier 2018 à 18:59:16 Wewerehappy a écrit :
Le temps de calcul different c'est normal je pense à cause de la répartition des taches sur le proco

Ok merci, je vais creuser la question

Creed56
Creed56
Niveau 10
06 janvier 2018 à 19:07:55

C'est normal que le LinkedList soit plus lent car c'est un chainage. En gros tu as un enregistrement qui enregistre ta valeur dans un variable du type que tu définis ( quand tu as LinkedList<E> la variable enregistrée est de type E) et deux pointeurs un qui pointe sur l'enregistrement suivant et l'autre qui pointe sur l'enregistrement précédent.

Du coup ici tu as des cases mémoires qui sont allouées au fur et à mesure que tu saisis des valeurs. Ce n'est pas comme dans les tableaux et Arraylist car ici tu as un zone mémoire non indicée. Dans les tableaux tu as des indices qui partent de 0 à n-1 de même pour l'arraylist.

La différence que tu observes entre le tableau et l'arraylist est normale également car dans le tableau tu définis une constante qui sera ton nombre de cases, sauf que l'arrayList à un nombre de cases défini bien qu'il utilise un compteur pour connaître le nombre de case que tu utilises.

TechnoBoomBoom
TechnoBoomBoom
Niveau 6
06 janvier 2018 à 19:09:40

Le 06 janvier 2018 à 19:07:40 Capitainerie a écrit :

Le 06 janvier 2018 à 18:56:54 TechnoBoomBoom a écrit :
Les tableaux sont bcp plus rapide car bas niveaux mais il faut + gerer sa memoire car elle est "fixe"
Quand tu crées un tableau tu dois mettre une taille

Ok merci pour ta réponse, mais je construit mon tableau avec la taille que je mets en paramètre de ma méthode.

Le 06 janvier 2018 à 18:59:16 Wewerehappy a écrit :
Le temps de calcul different c'est normal je pense à cause de la répartition des taches sur le proco

Ok merci, je vais creuser la question

Oui mais ce que je voulais dire c'etait surtout le fais que les tableaux sont plus proche de la memoire donc plus rapide a lire/ecrire mais que c'etait chiant parce que si tu veux manipuler ton tableau (rajouter des elements, suppr, etc)

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:09:42

Le 06 janvier 2018 à 19:07:55 creed56 a écrit :
C'est normal que le LinkedList soit plus lent car c'est un chainage. En gros tu as un enregistrement qui enregistre ta valeur dans un variable du type que tu définis ( quand tu as LinkedList<E> la variable enregistrée est de type E) et deux pointeurs un qui pointe sur l'enregistrement suivant et l'autre qui pointe sur l'enregistrement précédent.

Du coup ici tu as des cases mémoires qui sont allouées au fur et à mesure que tu saisis des valeurs. Ce n'est pas comme dans les tableaux et Arraylist car ici tu as un zone mémoire non indicée. Dans les tableaux tu as des indices qui partent de 0 à n-1 de même pour l'arraylist.

La différence que tu observes entre le tableau et l'arraylist est normale également car dans le tableau tu définis une constante qui sera ton nombre de cases, sauf que l'arrayList à un nombre de cases défini bien qu'il utilise un compteur pour connaître le nombre de case que tu utilises.

Ok merci pour ton explication sur le LinkedList, je comprends mieux maintenant :cool:

Mais l'ArrayList n'a justement pas de nombre de cases définie, non ?

LaChanclOnion
LaChanclOnion
Niveau 10
06 janvier 2018 à 19:10:54

[18:52:32] <Blaff11>
ArrayList ça doit être une linked list, tableau ça doit être une list continue en mémoire. https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Essaye maintenant d'insérer 10 000 000 fois un élément au milieu de ton tableau et compare.
Je dirais que le ArrayList est plus rapide en moyenne que le tableau.

PS: J'y connais rien en Java, juste des hypothèses sur les structures de données classiques.

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:11:00

Le 06 janvier 2018 à 19:09:40 TechnoBoomBoom a écrit :

Le 06 janvier 2018 à 19:07:40 Capitainerie a écrit :

Le 06 janvier 2018 à 18:56:54 TechnoBoomBoom a écrit :
Les tableaux sont bcp plus rapide car bas niveaux mais il faut + gerer sa memoire car elle est "fixe"
Quand tu crées un tableau tu dois mettre une taille

Ok merci pour ta réponse, mais je construit mon tableau avec la taille que je mets en paramètre de ma méthode.

Le 06 janvier 2018 à 18:59:16 Wewerehappy a écrit :
Le temps de calcul different c'est normal je pense à cause de la répartition des taches sur le proco

Ok merci, je vais creuser la question

Oui mais ce que je voulais dire c'etait surtout le fais que les tableaux sont plus proche de la memoire donc plus rapide a lire/ecrire mais que c'etait chiant parce que si tu veux manipuler ton tableau (rajouter des elements, suppr, etc)

Ouais c'est pour ça que je me casse pas la tête, j'utilise tout le temps les ArrayList. Mais là je vais y réfléchir à 2 fois, il y a moyen de carrément optimiser ses programmes avec les tableaux, même si ils sont supers chiant à manipuler

oga59
oga59
Niveau 10
06 janvier 2018 à 19:11:52

Utilise la fonction entrer :)

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:13:30

Le 06 janvier 2018 à 19:11:52 oga59 a écrit :
Utilise la fonction entrer :)

C'est quoi cette fonction là ? https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Devenir2Chaise
Devenir2Chaise
Niveau 10
06 janvier 2018 à 19:16:26

Une ArrayList c'est comme un tableau avec une taille non définie.
Donc quand tu initialises une arraylist, derrière, ça crée un tableau avec une taille donnée automatiquement. Sauf que si tu dépasses la taille allouée, Java va recréer un nouveau tableau en augmentant la taille. Donc toi ce que tu vois pas dans ton code, c'est la création de chacun de ces tableaux à chaque fois que tu rajoutes des entiers dans l'arraylist.
J'ai mal expliqué mais en très gros c'est ça.

Mieux expliqué :
"ArrayList<E>, on the other hand, allow fast random read access, so you can grab any element in constant time. But adding or removing from anywhere but the end requires shifting all the latter elements over, either to make an opening or fill the gap. Also, if you add more elements than the capacity of the underlying array, a new array (1.5 times the size) is allocated, and the old array is copied to the new one, so adding to an ArrayList is O(n) in the worst case but constant on average."
https://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist

Message édité le 06 janvier 2018 à 19:20:12 par Devenir2Chaise
Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:20:02

Le 06 janvier 2018 à 19:16:26 Devenir2Chaise a écrit :
Une ArrayList c'est comme un tableau avec une taille non définie.
Donc quand tu initialises une arraylist, derrière, ça crée un tableau avec une taille donnée automatiquement. Sauf que si tu dépasses la taille allouée, Java va recréer un nouveau tableau en augmentant la taille. Donc toi ce que tu vois pas dans ton code, c'est la création de chacun de ces tableaux à chaque fois que tu rajoutes des entiers dans l'arraylist.
J'ai mal expliqué mais en très gros c'est ça.

Ah mais oui c'est ça, je comprends maintenant. En fait comme on peut pas ajouter un élément à un tableau, on est obligé d'en créer un nouveau. C'est exactement ce que fait la méthode .add(); sur une List. Du coup c'est pour ça que ça prend trop de temps https://image.noelshack.com/fichiers/2017/31/5/1501857511-jesussmile.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:23:27

Le 06 janvier 2018 à 19:20:57 JeanCroutenard a écrit :
Oula, beaucoup de confusions sur ce topic. Les tableaux n'ont rien d'intrinsèquement plus rapide que les listes. Là le problème c'est que tu te sers de tes listes comme si c'étaient des tableaux, et du coup c'est inoptimal. En l'occurrence je pense que ton sumTab et sumArray doivent mettre à peu près le même temps, c'est dans fabricArray que t'as foiré.

Oui c'est la conclusion que je viens d'avoir https://image.noelshack.com/fichiers/2017/39/3/1506463227-risitaspeur.png

Mais je vois pas du tout comment construire une ArrayList des n premiers entrer autrement qu'avec ma méthode fabricArray https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Sous forums
  • Religion
La vidéo du moment