Keylearnings:
- Was ist eine Datenstruktur?
- Was ist ein Java Array?
- Was ist der Unterschied zwischen einer dynamischen und einer statischen Datenstruktur?
- Was ist der Nachteil einer dynamischen Datenstruktur?
- Wie du ein Array erstellst und initialisierst.
- Wie du die Länge eines Arrays mit Hilfe der Array length Eigenschaft herausfinden kannst.
- Wie du mit mehrdimensionalen Arrays umgehst.
Aufräumen fand ich blöd!
Immer dachte ich:
- Ordnung ist das halbe Leben, deshalb ordne ich nie und Lebe dafür ganz!
- Paah, das Genie beherrscht das Chaos. Und das locker!!
Erst als ich mich gefragt habe, wie zum Teufel schafft es ein Programm (z.B. eine Suchmaschine) aus 1789235235 Trillionen Datensätzen den einen, den ich suche in 0,0000003 Sekunden zu finden, wurde ich nachdenklich.
Anfangs dachte ich WOW super Augen.
Aber dann ging mir ein Licht auf. Die Antwort auf diese Frage ist Ordnung!
Denn du kennst das sicher, du stehst morgens auf und fragst dich: Was zum Geier ziehe ich heute an?
Du entscheidest dich für rote Socken. Du suchst und suchst und suchst, verpasst deinen Bus und kommst zu spät zur Arbeit.
Tja, Kundentermin schon vorbei. Kunde sauer. Deine Karriere im Eimer!
Was ist schief gelaufen?
Dein Problem war die Unordnung! Hättest du deine Socken nach farben sortiert, dann hättest du dein Outfit mit einem Handgriff zusammen gehabt.
Aber dir hat die richtige Ordnung gefehlt. Deshalb hast du viel Zeit mit dem Suchen deiner Socken vertrödelt.
Und genau das ist auch der Trick bei der Datenhaltung eines Computers.
Ein Computer findet nicht so schnell Daten, weil er so schnell danach suchen kann, sondern vielmehr, weil er aufgrund einer Ordnung schnell die Stelle in den Daten findet, an der nachgeschaut werden muss.
Und weißt du wie man man eine Ordnung von Daten in der Informatik nennt? Eine Datenstruktur!
Was ist eine Datenstruktur
Eine Datenstruktur kannst du dir also vorstellen wie ein Aktenschrank, in dem die Akten nach einem bestimmten System einsortiert sind (z.B. alphabetisch) oder wie ein Kleiderschrank, in dem du deine Klamotten farblich geordnet hast.
In diesem Artikel möchte ich dir die am häufigsten verwendete Datenstruktur vorstellen. Nämlich das Java Array!
Statische und dynamische Datenstrukturen
Ein Aktenschrank hat eine feste Größe und damit auch eine von Anfang an festgelegte Aufnahme-Kapazität. Die Kapazität eines Lagerhauses hingegen lässt sich (in gewissen Umfang) erweitern.
Genauso ist es bei den Datenstrukturen.
Es gibt statische Datenstrukturen, die ihre zu Anfangs festgelegte größe ihre ganze Lebensdauer über beibehalten. In diese Klasse fallen die Arrays. Und es gibt dynamische Datenstrukturen, hierzu gehört z.B. die sogenannte Java ArrayList, die während ihrer Lebensdauer ihre Speicherkapazität erweitern kann.
Kim, das hört sich so an, als wäre ein Array eine schlechtere ArrayList. Wozu brauche ich dann ein Array?
Naja, dynamische Datenstrukturen haben leider einen Nachteil. Das erweitern der Kapizität während der Laufzeit ist sehr rechenintensiv, wenn du es damit übertreibst, wird das die Performance deiner Programme stark einbremsen.
Viele Konzepte der dynamischen Speicherverwaltung kommen noch aus einer Zeit, in der Speicherplatz sehr teuer war.
Derzeit ist Rechenleistung aber als wertvoller einzuschätzen als Speicherplatz. Daher macht es absolut Sinn sich Rechenleistung auf Kosten vom Speicherplatz zu erkaufen.
Genug der Theorie! Schauen wir uns die Implementierung eines Array an.
Was ist ein Java Array
Du erinnerst dich an Franka? Genau! Franka ist die reizende Dame, für die wir bereits eine Einkaufs-App entwickelt haben.
Wie speicherst du die Artikel, die Franka kauft?
Mit dem was wir bisher wissen, haben wir nur die Möglichkeit für jeden Artikel eine Variable zu definieren. Nehmen wir an Franka möchte fünf Artikel kaufen.
Jeden Artikel könnten wir in eine String
Variable speichern. In Programmcode sieht das dann so aus:
1: String artikel1 = "Ei"; 2: String artikel2 = "Schokolade"; 3: String artikel3 = "Zahnpasta"; 4: String artikel4 = "Banane"; 5: String artikel5 = "Tiefkühlpizza";
Das ist nicht wirklich praktikabel.
Aber es wird noch schlimmer!
Überleg mal was wir tun müssen, um diese Daten auf dem Bildschirm auszugeben. Ja, mir fällt auch nichts besseres ein, als jede Variable einzeln auszugeben.
System.out.println(artikel1); System.out.println(artikel2); System.out.println(artikel3); System.out.println(artikel4); System.out.println(artikel5);
Ojee, das macht keinen Spaß! Wäre es nicht toll, wenn wir einfach über die Artikelnummer (also 1 für Ei, 2 für Schokolade..u.s.w.) auf die Artikel zugreifen könnten?
Jaaa!! Das wäre toll!!
Und genau hierfür gibt es die Arrays! Warte ich zeigs dir.
Java Array erstellen
Arrays ermöglichen es dir den Speicherplatz für Franka’s fünf Artikel in einem Rutsch zu deklarieren. Ein Array wird durch eckige Klammern gekennzeichnet.
1: String[] artikel;
Nach diesem Programmcode haben wir ein Array artikel
erstellt. Allerdings haben wir noch keinen Speicher reserviert.
Damit Speicher reserviert wird, müssen wir noch angeben, wie viele Elemente das Array haben soll.
Für diesen Zweck gibt es das Schlüsselwort new
. Da wir fünf Artikel speichern möchten, muss artikel
ein String
Array sein, das fünf Elemente aufnehmen kann.
Das erzeugen wir mit folgendem Programmcode:
1: artikel = new String[5];
Hiermit haben wir Speicherplatz für fünf Strings reserviert. Allerdings haben wir diesem Speicherplatz noch keine Werte zugewiesen. Darum kümmern wir uns als nächstes.
Das JAVA Array initialisieren
Um den von uns beschlagnahmten Speicherplatz zu nutzen, müssen wir auf die einzelnen Array-Elemente zugreifen. Das machen wir indem wir den Index des Elements in eckigen Klammern direkt hinter den Namen des Array schreiben.
Schwer vorzustellen? Kein Problem! Ich mache es dir vor! Wir initialisieren das Array mit Franka’s fünf Artikeln.
Hierbei müssen wir beachten, dass die Elemente von Null beginnend gezählt werden.
artikel[0] = "Ei"; artikel[1] = "Schokolade"; artikel[2] = "Zahnpasta"; artikel[3] = "Banane"; artikel[4] = "Tiefkühlpizza";
Erkennst du den Vorteil?
Wir können die Elemente jetzt einfach ausgeben indem wir über eine for-Schleife alle Elemente des Array durchlaufen.
Die Eigenschaft Java Array length
Um die Anzahl der Elemente des Arrays herauszufinden fragen wir die Eigenschaft length
ab.
1: for (int i = 0;i < artikel.length;i++){ 2: System.out.println(artikel[i]); 3: }
Naa, was erwartest du? Jepp, es werden untereinander die fünf im Array gespeicherten Elemente ausgegeben.
Ei Schokolade Zahnpasta Banane Tiefkühlpizza
Warte mal!
Was wäre gewesen, wenn wir das fünfte Element (Tiefkülpizza mit Index 4) nicht initialisiert hätten. Wie wäre die Ausgabe und welchen Wert würde die Eigenschaft java Array length liefern?
Die length
Eigenschaft ist unabhängig davon, ob die einzelnen Elemente mit Werten gefüllt sind oder nicht. Wir haben Speicherplatz für fünf Strings
reserviert, deshalb liefert length
den Wert vier.
KEIN DRUCKFEHLER! Denn immer schön dran denken, wir fangen mit dem Zählen bei Null an.
Ein nicht initialisiertes Element erhält automatisch den Standardwert des jeweiligen Datentyps. Da wir mit Strings arbeiten ist das bei uns der Wert null
. Hätten wir es mit einem Integer Array zu tun, dann wäre es der Wert 0
.
Okay, hier die Programmausgabe, wenn wir das Element mit Index 4 nicht initialisieren.
Ei Schokolade Zahnpasta Banane null
Es gibt noch eine weitere Möglichkeit ein Java Array zu initialisieren. Und zwar direkt bei der Definition des Arrays.
String[] artikel = {"Ei","Schokolade","Zahnpasta","Banane","Tiefkühlpizza"};
Diese Programmzeile hat die gleiche Auswirkung wie unsere Einzelinitialisierung von oben. Auch hier wird ein String mit fünf Elementen erzeugt.
Die Werte in den geschweiften Klammern werden der Reihe nach dem Array zugewiesen. Das Ei wird also im Element artikel[0]
, die Schokolade in Artikel[1]
usw. gespeichert.
Du forderst den Beweis? Gut! Durchlaufen wir das Array mit einer for-Schleife und geben jedes Element des Arrays der Reihe nach auf dem Bildschirm aus.
String[] artikel = {"Ei","Schokolade","Zahnpasta","Banane","Tiefkühlpizza"}; for (int i = 0;i < artikel.length;i++){ System.out.println(artikel[i]); }
Hier die Programmausgabe:
Ei Schokolade Zahnpasta Banane Tiefkühlpizza
Siehst du!! Habe ich dir doch gleich gesagt. Keine Veränderung!!
Ich habe die Schritte, die du gehen musst um mit einem Array zu arbeiten nochmal in einem kleinen Video zusammengefasst.
Mehrdimensionale Arrays
Milch gibt es von einer weißen oder von einer braunen Kuh. Ein Ei kann von einem Huhn oder einem Strauss sein.
Wie bringen wir diese Informationen in unserer Datenstruktur unter?
Hierfür gibt es die mehrdimensionalen JAVA Arrays.
Am besten zu veranschaulichen ist das in einer Tabelle.
In einer Tabelle gibt es Spalten und Zeilen. Jede Zeile und jede Spalte hat eine eigene Nummerierung. Wir arbeiten also nicht mehr mit einem einzelnen Index sondern mit einem Indexpaar.
0 | 1 | |
---|---|---|
0 | Straussenei | Milch von weißer Kuh |
1 | Hühnerei | Milch von brauner Kuh |
So steht z.B. das Indexpaar (0,1) für die Information, die in der ersten Zeile und der zweiten Spalte steht. In unserem Fall also „Milch von einer weißen Kuh“.
Und dieses Konzept lässt sich auf mehrdimensionale Java Arrays übertragen. Wobei mehrdimensional bei einer Tabelle natürlich zweidimensional bedeutet.
Deklaration eines mehrdimensionalen JAVA Arrays
Für jede Dimension muss bei der Deklaration des Array ein Paar von eckigen Klammern (eine öffnende und eine schließende Klammer) angegeben werden.
String[][] artikelTabelle; //zweidimensional String[][][] artikelWürfel; //dreidimensional String[][][][] wieAuchImmer; //vierdimensional
Genau wie bei einem normalen Array, ist auch hier zunächst kein Speicherplatz beschlagnahmt. Auch bei mehrdimensionale Arrays muss der Speicherplatz erst reserviert werden. Aber das geht wie gewohnt mit dem Schlüsselwort new
.
Wir wollen unsere obige Tabelle in einem Array abbilden. Wir benötigen also ein zweidimensionales Array mit zwei Zeilen und zwei Spalten.
String[][] artikelTabelle; artikelTabelle = new String[2][2];
Hierbei steht der erste Index für die Zeilen und der zweite für die Spalten der Tabelle.
Okay, als nächstes müssen wir das mehrdimensionale Java Array mit Daten füllen. Hierzu weisen wir einfach die Werte aus der obigen Tabelle entsprechend zu.
artikelTabelle[0][0] = "Straussenei"; artikelTabelle[0][1] = "Milch von weißer Kuh"; artikelTabelle[1][0] = "Hühnerei"; artikelTabelle[1][1] = "Milch von brauner Kuh";
Gut, soweit alles plausibel. Jetzt möchten wir noch den Inhalt des Arrays auf den Bildschirm ausgeben.
Hier die einzelnen Schritte nochmal in einem kleinen Video dargestellt.
Die Java Array length Eigenschaft bei mehrdimensionalen Arrays.
Wieder erzeugen wir die Ausgabe, indem wir mittels der for-Schleife das Array durchlaufen und die Inhalte auf dem Bildschirm ausgeben.
Genauer gesagt benötigen wir natürlich zwei for-Schleifen. Eine für den Zeilenindex und eine zweite für den Spaltenindex. Und die beiden Schleifen müssen in einander verschachtelt sein.
Aber das klingt mir in der Theorie alles viel zu kompliziert, daher schnell auf in die Praxis.
1: for(int i = 0;i<artikelTabelle.length;i++){ 2: for(int j = 0;j<artikelTabelle[0].length;j++){ 3: System.out.println(artikelTabelle[i][j]); 4: } 5:}
Wir verwenden wie angekündigt zwei for-Schleifen. Die äußere Schleife in Zeile eins ist für den ersten Index (also die Zeilen) verantwortlich.
Die zweite Schleife wird für jede Zeile ausgeführt und durchläuft den zweiten Index (also die Spalten).
Im Ergebnis bedeutet das, dass die Tabelle zeilenweise ausgegeben wird. Die Programmausgabe lautet.
Straussenei Milch von weißer Kuh Hühnerei Milch von brauner Kuh
Besonderes Augenmerk solltest du darauf legen, wie wir die Java Array length Eigenschaft des mehrdimensionalen Arrays abfragen.
Die Länge der ersten Dimension fragen wir ab, indem wir die Eigenschaft length
des Arrays artikelTabelle
in der ersten for-Schleife auslesen.
Um die Länge der zweiten Dimension herauszubekommen müssen wir auf ein konkretes Array-Element der ersten Dimension zugreifen und dort die Eigenschaft Java Array length auslesen.
Das machen wir in der zweiten for-Schleife, in der wir auf artikelTabelle[0]
zugreifen.
Sieht komisch aus, aber es funktioniert.
FAZIT
Das Array ist die wichtigste statische Datenstruktur. Einem Array sehr ähnlich ist die sogenannte ArrayList. Hierbei handelt es sich um ein Array bei dem du den Speicher dynamisch reservieren kannst. Hiermit wollen wir uns im nächsten Teil dieser Artikelserie beschäftigen.
Wie immer freue ich mich über deine Fragen im Kommentarbereich!
Hat dir der Artikel gefallen? Dann folge uns doch am besten gleich auf Facebook!
MrX
29. April 2018 at 15:49Warte was?
„Derzeit ist Rechenleistung aber als wertvoller einzuschätzen als Rechenleistung.“
(unter „Kim, das hört sich so an, als wäre ein Array eine schlechtere ArrayList. Wozu brauche ich dann ein Array?“)
Kim Peter
29. April 2018 at 16:18Danke für den Hinweis! Habe es korrigiert. Eine ArrayList ist eine dynamische Datenstruktur. Also eine Datenstruktur, die sich selbst um die Reservierung von Speicherplatz kümmert sobald er gebraucht wird. Das führt nahtürlich zu einem gewissen Verwaltungsaufwand der Rechenleistung benötigt. Bei einem Array musst du den benötigten Speicherplatz selber angeben und der ist während der Programmlaufzeit dann Fix. Hast du also beispielsweise ein Array mit Platz für 10 Elemente, dann hast du ein Problem, wenn du 11 Elemente speichern musst. Dafür fällt aber der Verwaltungsaufwand weg, weshalb ein normales Array minimal weniger Rechenleistungs als eine ArrayList benötigt. Viele Grüße Kim
Christian
12. März 2020 at 10:32Herrlich, es ist eine Wonne dir zuzuhören!
Kim Peter
25. März 2020 at 7:54Dankeschön! 🙂
Choose a style: