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
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
Somme Tableau -> 0.016 secondes
Somme ArrayList -> 2.594 secondes
Comment expliquer ça ?
Et d'ailleurs c'est jamais le même temps de calcul quand je compile, je comprends pas pourquoi non plus 

ArrayList ça doit être une linked list, tableau ça doit être une list continue en mémoire.
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.
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.![]()
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
Mais je vais essayer ton truc, ça a l'air marrant 
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
BTW, y'a des fonctions qui existent pour avoir la taille ton arraylist et de ton tab
Le temps de calcul different c'est normal je pense à cause de la répartition des taches sur le proco
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 
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
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.
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 tailleOk 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 procoOk 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)
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
Mais l'ArrayList n'a justement pas de nombre de cases définie, non ?
[18:52:32] <Blaff11>
ArrayList ça doit être une linked list, tableau ça doit être une list continue en mémoire.![]()
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.
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 tailleOk 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 procoOk 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
Utilise la fonction entrer ![]()
Le 06 janvier 2018 à 19:11:52 oga59 a écrit :
Utilise la fonction entrer
C'est quoi cette fonction là ? 
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
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 
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
Mais je vois pas du tout comment construire une ArrayList des n premiers entrer autrement qu'avec ma méthode fabricArray 