Ein Grund, warum Programmierklassen im ersten Jahr Arrays verwenden, ist Legacy: So haben es die Professoren ursprünglich gelernt, bevor wir mit der Verwendung von Standardbibliotheken mit eingebauten dynamischen Listen begonnen haben Sprache unter der Sonne (und kann in einer Handvoll Montageanleitungen implementiert werden). Als ich das Programmieren zum ersten Mal lernte, war die Implementierung einer verknüpften Liste eine der Aufgaben.
Es ist viel einfacher, von den Grundprinzipien auszugehen und dann zu sagen: "Das ist die Grundstruktur. Diese Sprache (oder ihre Bibliotheken) bietet Ihnen diese übergeordnete Datenstruktur, die all das leistet, aber Ihnen x, y und z gibt." Es heißt: "Das sind also diese Datenstrukturen auf hoher Ebene. Hier ist, was unter der Haube ist." Zu lernen, wie man über die Verwendung einer LinkedList im Vergleich zu einer ArrayList (oder eines HashSet im Vergleich zu einem TreeSet) urteilt, ist normalerweise ein Algorithmuskurs im zweiten oder dritten Jahr. Listen und Karten haben die gleichen Oberflächen und führen zu den gleichen Ergebnissen, können sich jedoch in einer Anwendung jeder Größe dramatisch unterscheiden. Und wenn Sie Programmieren 101 verlassen, gibt es keine Garantie dafür, dass Programmieren 102 dieselbe Sprache verwendet. Wenn Sie vom Konzept eines Arrays ausgehen, können Sie einfach sagen "
Ein weiterer Grund für den Vorzug von "Array" gegenüber "List" in einem Einführungskurs ist, dass Arrays grundsätzlich leicht zu verstehen sind: Ein Array von 20 bytes
benötigt 20 Bytes (plus ein Paar, um je nach Implementierung entweder das Ende des Arrays oder die Länge anzugeben) ).
Eine "Liste" ist ein völlig anderer Fischkessel und kann auf viele verschiedene Arten implementiert werden (ArrayList, LinkedList und wahrscheinlich ein paar, die ich vergessen habe), mit grundlegend unterschiedlichen Leistungsmerkmalen. Ohne die Eingeweide der verschiedenen List-Klassen zu verstehen, können Sie nicht sinnvoll diskutieren, wann Sie List foo = new ArrayList()
vs. verwenden sollten List foo = new LinkedList()
. Wenn Sie versuchen , die Schüler zu bekommen eine Liste Implementierung zu verwenden, jemand wird sich fragen , warum Sie Arraylist verwenden anstelle von einer der anderen Implementierungen. Und "ArrayList" enthält das Wort "Array" und wird durch eins unterlegt, so dass es wirklich kein großer logischer Sprung von "Array" zu "ArrayList" ist.
Entgegen der landläufigen Meinung gibt es Situationen, in denen es sinnvoll ist, Arrays über Listen zu verwenden, insbesondere wenn Sie mit einer Liste statischer Größen arbeiten. Hier sind ein paar:
- Das Nachschlagen und die Iteration sind etwas schneller, da Sie sich nicht mit dem Overhead des Methodenaufrufs befassen:
foo[n]
Dereferenzierungen und einige Arithmetikaufgaben für Zeiger im Hintergrund, während foo.get(n)
eine Dereferenzierung, ein Methodenaufruf, eine zweite Dereferenzierung und dann möglicherweise eine Zeigerarithmetik durchgeführt werden müssen (Wenn Sie eine ArrayList verwenden, müssen LinkedLists möglicherweise jedes Element der Liste durchlaufen.)
- Die Initialisierung ist viel sauberer:
int[] foo = new int[]{1, 2, 3, 4, 5}
im Vergleich zu den Vorschlägen in einer anderen StackOverflow-Frage