Die meisten Aufgaben in meiner Schule für die anfänglichen Programmierstunden erforderten die Verwendung von Arrays. Ich arbeite jetzt ganztägig und habe nie ein Array für ein Projekt verwendet, an dem ich gearbeitet habe. Selbst in den bestehenden Projekten habe ich nie die Verwendung von Arrays gesehen. Meiner Meinung nach ist List einfacher zu bedienen und ein Standard. Warum fordern Professoren die Studenten auf, Arrays in ihren Aufgaben zu verwenden? Ist es nur so, dass die Schüler die Grundlagen verstehen?
Da die meisten Universitäten Java unterrichten, ist diese Frage spezifisch für Java.
java
programming-languages
programming-practices
Heult Hagrid
quelle
quelle
Antworten:
Weil Arrays Konzepte wie Indizierung und Schranken lehren, zwei grundlegend wichtige Konzepte in der Computerprogrammierung.
Listen sind kein "Standard". Es gibt eine Vielzahl von Problembereichen, für die Arrays perfekt geeignet sind.
quelle
Sie wollten wahrscheinlich mit der Datenstruktur beginnen, die die Funktionsweise eines Computers am genauesten widerspiegelt. Daher sind Sie mit den Grundlagen vertraut, bevor Sie übergeordnete Abstraktionen wie Listen einführen, die die Arbeit mit dem Computer erleichtern. Andernfalls könnten Sie nicht verstehen, warum eine bestimmte Struktur oder ein bestimmter Algorithmus für einige Operationen langsam / schnell ist und für andere nicht. Wenn der Computerspeicher tatsächlich aus verknüpften Listen bestehen würde, wäre die Welt ein ganz anderer Ort.
Aus dem gleichen Grund war meine erste Programmierstunde am College in C, und der Rest der Stunden war allesamt in C ++, Java und anderen Sprachen. Es ist nicht so, dass C irgendwie besser oder einfacher ist, sondern dass C (und Array) nichts vor Ihnen verbirgt.
quelle
Die Antworten oben sind großartig, aber ich habe andere im Sinn. Die
main()
Methode von Java bedeutet, dass die Schüler sehr früh auf grundlegende Anordnungen stoßen, oft schon am ersten Kurstag. Warum?Es ist das Erste, mit dem Sie sich befassen müssen, um Hello World und darüber hinaus zu schreiben. (Ich habe gesehen, dass in einigen Kursen zuerst IDEs wie BlueJ verwendet werden, mit denen Sie beliebige Methoden mit einem Mausklick ausführen können, aber wir werden diese beiseite legen ...) Es kann sich auch lohnen, einige davon zu übergeben Diese Schlüsselwörter werden die meisten Lehrer früher oder später für eine Weile erklären wollen. In der Tat besteht eine klassische Anfängerfrage darin, die Schüler zu bitten, die Bedeutung der einzelnen Schlüsselwörter in einem grundlegenden Hello World-Programm anzugeben. Und was finden wir als Teil unserer Hauptmethodenunterschrift? Ein Array (Der Grund dafür ist teilweise historisch. ArrayList war in Java 1.0 nicht vorhanden). Arrays sind Teil dieses Grundwissens. Liste ist nicht.
Das heißt, es ist nicht ungewöhnlich, dass Klassen ArrayList etwas später in den Kurs einführen, insbesondere wenn Objekte und deren Verwendung behandelt wurden. Sogar das AP Computer Science-Curriculum für Java enthält ArrayList (ich weiß, dass es früher verwendet wurde, und Google scheint darauf hinzuweisen, dass dies immer noch der Fall ist), obwohl es die Tatsache ignoriert, dass ArrayList List und den Rest des Collections Frameworks implementiert.
Schließlich ist es meine Erfahrung, dass Universitäts-CS-Programme Java verwenden, um CS- und Programmierkonzepte zu erkunden, anstatt den Schülern beizubringen, gute Java-Entwickler zu werden. Einige Programme konzentrieren sich eher darauf, professionelle Entwickler herauszufordern, während andere sich eher auf die Theorie konzentrieren. In beiden Fällen gibt es jedoch noch viel zu lernen, wie man Java in einer echten professionellen Arbeit einsetzt, die in den meisten Lehrplänen am College nicht gelehrt wird. Dies reicht von Entwurfsmustern und -techniken wie in Effective Java bis hin zu Frameworks wie Spring, Hibernate oder JUnit oder sogar noch häufigeren Dingen wie JSP oder JDBC. Unter Berücksichtigung dieser Philosophie ist es etwas sinnvoller, Arrays über die am häufigsten verwendete ArrayList zu betonen.
quelle
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 solltenList 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:
foo[n]
Dereferenzierungen und einige Arithmetikaufgaben für Zeiger im Hintergrund, währendfoo.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.)int[] foo = new int[]{1, 2, 3, 4, 5}
im Vergleich zu den Vorschlägen in einer anderen StackOverflow-Fragequelle
perm
es ein istint[256]
, das eine Permutation enthält, kann man es leicht mit einem Array invertieren:int[] inv = new int[256]; for (int i=0; i<256; i++) inv[perm[i]]=i;
Ich glaube nicht, dass irgendetwas, mit dem man schreiben könnte,ArrayList<>
so sauber wäre.ArrayList
hätte leicht einen Konstruktor bekommen können, der eine standardmäßig initialisierte Liste einer bestimmten Größe erstellt.get
undset
nicht inlined bekommen.get
undset
kann ausgekleidet werden, so etwasmyList.set(23,myList.get(23)+1)
wird bei weitem nicht so effizient sein wiemyArray[23]+=1
. Sogar für Typen, die kein Boxen benötigen, wäre ich sehr überrascht, wenn ein JITter irgendetwas enthalten könnte, das mit irgendetwas vergleichbar ist,for (i=0; i<1000; i++) myList2.set(i+2000,myList2.get(i+3000));
dessen Leistung irgendwo in der NäheSystem.arrayCopy(myArray1,3000,myArray2,2000,1000);
liegt. aber Java nicht.Mit Java können Variablen jeden Typs in Arrays gespeichert werden.
ArrayList
Ermöglicht dagegen nur die Speicherung von Referenzen. Man kann daher nicht sinnvoll diskutieren,ArrayList
ohne vorher abzudecken , wie Auto-Boxing Primitive in Referenztypen umwandelt und wie Auto-Unboxing manchmal Referenztypen in Primitive umwandelt:Wenn der Code eine
int[3]
anstelle einer verwendet hätteArrayList
, würde es keine Überraschungen geben. Alle drei Elemente würden gleichi
und miteinander vergleichen . WennArrayList
jedoch alle drei Elemente der Liste immer gleichi
sind und das erste und dritte immer gleich sind, gleichen sich die ersten beiden Elemente nur dann, wenni
1, 10 oder 100, aber (bei den meisten Implementierungen) nicht beii
1000 oder 10000.quelle
Integer
Klasse hat eine verschachtelte Klasse namens,IntegerCache
die vorinitialisierteInteger
Objekte für einen Wertebereich enthält, der normalerweise -128..127 beträgt. Wenn Sie einen Wert außerhalb dieses Bereichs boxen, müssen Sie ein neues Objekt erstellen. Wenn Sie jedoch einen Wert innerhalb des zwischengespeicherten Bereichs boxen, wird lediglich ein Verweis auf eines der vorinitialisierten Objekte zurückgegeben, die in gespeichert sindIntegerCache.cache
. Jeder gute Java-Programmierer muss sich darüber im Klaren sein, dass zweiInteger
Variablen, die denselben Wert enthalten, möglicherweise gleich sind oder nicht, aber eine zu frühe Einführung dieser Idee kann die Schüler vor Angst fliehen lassen.==
. In Anbetracht der Möglichkeit, dass Auto-Unboxing werfen kann, würde ich es ganz verbieten, aber sein Verhalten mit==
ist besonders schrecklich. Der==
Operator verhält sie auch schlecht in Fällen wie16777217==16777216f
[Berichte wahr], und die impliziten Konvertierungen fürlong v=Math.Round(123456789), w=Math.Round(123456789012345)
geeignet sind , unerwartet zu sein [kann man erraten , was diese Ausdrücke ergeben wird?]IntegerCache
gibt es sicherlich Zeiten , wenn es Leistung helfen kann, aber es kann häufig Ursache - Code, der an Just Plain zu irgendwie-sorta Arbeit. In mancher Hinsicht wünschte ich mir, es gäbe einen Modus, in dem das Boxen Objekte aus zwei ganzzahligen Caches quasi zufällig zurückgibt und Cache-Elemente quasi zufällig durch neue ersetzt, sodass der Code auf dem Boxverhalten der Werte -128..127 beruht Es ist unwahrscheinlich, dass dies sehr lange gelingt.Ich halte es für sinnvoll, zunächst zu lehren, wie Arrays
ArrayList
verwendet werden, da ein Array intern verwendet wird. DieArrayList
Klasse hat eine Member-Variable namens,elementData
die einObject
Array ist.Aus dem JDK-
ArrayList
Quellcode :Wenn Sie Elemente hinzufügen, aktualisieren, abrufen oder entfernen
ArrayList
, werden diese Vorgänge über dieses interne Array ausgeführt. Wie der Benutzer Ixrec bereits betont hat,ArrayList
handelt es sich lediglich um eine übergeordnete Abstraktion, mit der in der Regel einfacher zu arbeiten ist.quelle
Java
: Es wurde gefragt, warum Arrays unterrichtet werden, wenn dies normalerweise der Fall istArrayList
. Java hat keine Zeiger. Richtig oder falsch, ich bin der Meinung, dass C / C ++ eine bessere Sprache für Anfänger ist als Java. Viele Themen der Programmierung lassen sich besser verstehen, wenn man sich mit C / C ++ auskennt.Angenommen, mit dieser Liste lässt sich in der Tat leichter arbeiten, wie Sie sagen - das ist eigentlich egal. Lernen ist mehr von "einfach bis komplex" als von "einfach bis schwer". Wenn Grundlagen nicht wichtig wären, wäre Informatik kein akademisches Gebiet. In Online-Tutorials können Sie einfach lernen, wie Sie Apps mithilfe vorhandener Frameworks / Bibliotheken zusammenklicken. (Natürlich muss jemand diese Bibliotheken schreiben ... und jemand muss sie zuerst implementieren
ArrayList
....)quelle
ArrayList
könnte diese Verwendung durch Verwendung eines separaten Arrays und der Anzahl "liveItems" besser gehandhabt werden, mit der Ausnahme, dass es keine bequeme Möglichkeit gibt, mit dem Array zu arbeiten und zusammen zu zählen, außer sie zu aggregieren.Das Wichtigste in der akademischen Ausbildung ist, dass Sie lernen, die richtigen Begriffe zu verwenden, um Ihre Tätigkeiten zu beschreiben.
Liste ist etwas anderes als Array. und Sie können nicht
java.util.List
in Java verwenden, weil es eine Schnittstelle ist. Normalerweise verwenden Sie,java.util.ArrayList
was eine List-Implementierung ist, keine Liste, sondern einen Objekt-Wrapper um ein dynamisches Array. Sie sagen also, Sie verwenden eine 'Liste', aber Sie verwenden ein Array.Es ist sehr vernünftig, dieses terminologische Chaos zu überspringen und einfach Arrays zu verwenden, um den Schülern zu erklären, was Array ist. Wenn Sie Arrays in Java verwenden, verwenden Sie zumindest Arrays.
Ehrlich gesagt ist es auch das Argument, warum das Unterrichten von Programmierung mit Java keine gute Idee ist. Es ist schwer, die grundlegenden Konzepte der Programmierung richtig zu lernen.
quelle
Sie haben buchstäblich noch nie ein Array gesehen oder benutzt? Wir verwenden sie ständig zusätzlich zu Listen. Wir verwenden normalerweise kein Java, aber wir verwenden viele andere Sprachen, die offensichtliche Ähnlichkeiten aufweisen.
Zwischen Arrays und Listen ist das eine leichter und darüber hinaus präziser, während das andere mehr Funktionen bietet. Als allgemeine Regel in der Programmierung sollten Sie, wenn es zwei ähnliche Typen gibt, die im Grunde nach diesen Grundsätzen unterteilt sind, den leichteren wählen, es sei denn, Sie benötigen tatsächlich den schickeren. Dies reduziert nicht nur den Overhead, sondern hilft auch dabei, die Unordnung und den Status im Programm und insbesondere den Code im Griff zu behalten . Wenn beim Testen etwas schief geht, müssen Sie weniger nachsehen. und was noch wichtiger ist, im Fall von Arrays im Vergleich zu Listen erhalten die Benutzer eine bessere Vorstellung von dem begrenzten Umfang dessen, wofür Sie es tatsächlich verwenden und versuchen, damit umzugehen.
Und ja, aus akademischer Sicht gibt es den zusätzlichen Grund, den Schülern die Grundlagen beizubringen. Dies geht jedoch etwas tiefer. Arrays und Listen sind ein gutes Beispiel für umfangreichere Typen, die häufig nur auf Basisinstanzen der leichteren Typen erstellt werden und diese häufig nur umschließen. Auch wenn Listen keine zugrunde liegenden Arrays haben, verhalten sie sich äußerlich genauso wie sie. Ein Teil davon, jemandem beizubringen, was eine Liste ist, besteht darin, ihm beizubringen, was ein Array ist.
Ich konnte sehen, dass dies in einer Sprache wie C ++ möglicherweise aus dem Ruder läuft, wo Arrays im Grunde genommen nicht einfacher als sie sind, aber in höheren Sprachen sind sie fast Listen für sich. Wenn sie in einer bestimmten Situation perfekt zu Ihren Bedürfnissen passen, warum sollten Sie dann etwas anderes verwenden?
quelle
T[]
Gerät ist direkt vor dem Tor bereit, Elemente in beliebiger Reihenfolge zu akzeptieren, während esArrayList<T>
erforderlich ist, dass Elemente der Reihe nach hinzugefügt werden, bevor sie geändert werden können. AT[]
kann einen beliebigen Bereich von ElementenT[]
relativ schnell in einen Bereich mit ähnlicher Größe kopieren , währendArrayList<T>
Elemente einzeln aus einer Liste gelesen und in der anderen gespeichert werden müssen - viel langsamer und unbequemer.