Dans une liste liée, chaque élément a un pointeur vers l'élément suivant:
head -> item1 -> item2 -> item3 -> etc.
Pour y accéder item3
, vous pouvez voir clairement que vous devez marcher de la tête à travers chaque nœud jusqu'à ce que vous atteigniez l'élément 3, car vous ne pouvez pas sauter directement.
Ainsi, si je voulais imprimer la valeur de chaque élément, si j'écris ceci:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
ce qui se passe est ceci:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
C'est horriblement inefficace car chaque fois que vous indexez, il redémarre depuis le début de la liste et parcourt chaque élément. Cela signifie que votre complexité est effectivement O(N^2)
juste de parcourir la liste!
Si à la place je faisais ceci:
for(String s: list) {
System.out.println(s);
}
alors ce qui se passe est ceci:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
le tout en un seul parcours, qui est O(N)
.
Maintenant, passons à l'autre implémentation List
dont ArrayList
celle-ci est soutenue par un simple tableau. Dans ce cas, les deux parcours ci-dessus sont équivalents, puisqu'un tableau est contigu, il permet donc des sauts aléatoires vers des positions arbitraires.