Arrays
(1) "Gruppen" von Objekten
In der Programmierung ist es häufig notwendig, Gruppen von Objekten gleichen Typs zu benutzen: Eine Liste von Wörtern soll verarbeitet werden, für alle Studenten mit dem Vermerk "Semestergebühr nicht bezahlt" soll eine Mahnung verschickt werden, eine Liste von MP3-Dateien soll abgespielt werden etc. Diese "Listen"-Strukturen können dabei unterschiedlich implementiert werden - je nach Anwendungsfall (viele Suchoperationen in der Liste, viele Einfüge/Lösch-Operationen, Zugriff immer nur auf das erste/letzte Element, Zugriff aus parallel laufenden Programmen etc) ist dann eine jeweilige Implementation vorteilhaft. Eine Auswahl verschiedener Listen- bzw. Collection-Typen von Java wird im Laufe des Kurses vorgestellt, zunächst soll das Konzept des Arrays vorgestellt werden. Dabei handelt es sich um eine besondere Möglichkeit der "Gruppierung" von Objekten, denn Arrays werden - im Gegensatz zu allen anderen Collection-Strukturen - mit Hilfe syntaktischer Mittel (genauer: eckige Klammern) in Java realisiert.
(2) Der Begriff Array
Arrays fassen Werte gleichen Typs in einer Einheit zusammen. Einzelne abgelegte Werte können über einen Index angespochen werden. Indizes werden in eckigen Klammern angegeben, der Index beginnt bei 0 und ist immer eine ganze Zahl. Über den Indexwert hat man den "direkten" Zugriff auf ein einzelnes Arrayelement, mit einer Schleife über die Indexwerte hat man auch den sequentiellen Zugriff auf alle Arrayelemente (Zugriffsformen auf die Datenstruktur Array). Die Daten werden konsekutiv im Speicher angelegt. Der Arrayname steht für die Anfangsadresse dieses Datenbereichs der einen in Java (und auch C) bei 0 beginnenden Index hat. Ein bestimmtes Datum wird per Indizierung adressiert.
(3) Details
Deklaration eines eindimensionalen Arrays bzw. einer Arrayvariablen:
Integer ist der Elementtyp. Er gibt an, dass es sich um ein eindimensionales Feld handelt. Zulässig ist auch die ältere C-Syntax, die in der Veranstaltung aber nicht benutzt wird:
Eine Arrayvariable kann aber auch einen Bezug (Referenz, reference) auf ein Arrayobjekt speichern.
(4) Erzeugung von Arrays
Mit der Deklaration einer Arrayvarirablen wurde noch kein Arrayobjekt angelegt. Ein Arrayobjekt entsteht erst durch die Verwendung eines Arrayliterals oder durch die Erzeugnung eines Arrayobjekts mit dem new-Operator.
Beispiel:
Im zweiten Fall, in dem den einzelnen Elementen des Arrays nicht unmittelbar ein Wert zugewiesen wird, werden die Elemente mit dem "Default-Objekttyp" null initialisiert.
(5) Zugriff auf Arrays
Beispiele:
Ein Arrayelement entspricht einer einfachen Variablen des Arrayelementyps. Es kann lesend in Ausdrücken und schreibend in Wertzuweisungen verwendet werden. Der Indexausdruck muss einen Wert im zulässigen Wertebereich ergeben - dies wird jedoch nicht vom Compiler, sondern erst zur Laufzeit des Programms geprüft! Eine Anweisung wie "feld1[-3] = 5;" ist syntaktisch korrekt, in der Ausführung des Programms wird jedoch der Fehler "ArrayIndexOutOfBounds" produziert.
(6) Arrays sind Objekte
In Java sind die Arrays als Objekte implementiert. Klassisch spricht man im Gegensatz zu einfachen Datentypen bei Arrays und Records / Structs bzw. Objekten von strukturierten Datentypen. Strukturierte Datentypen bestehen potentiell aus mehreren Komponenten bzw. Elementen. Strukturierte Daten sind also potentiell relativ groß. Man wird also z.B. bei der Parameterübergabe das Kopieren aller Daten vermeiden wollen. Deshalb werden strukturierte Daten meistens (und in Java immer) über ihre Adresse verwaltet. Variablen für Objekte sind sogenannte Referenzvariablen, die eine Referenz auf ein Objekt (seine Adresse) speichern. Klassisch heißen Referenzdatentypen Pointer (Zeiger), wegen des Zeige- oder Verweischarakters von Objektadressen. Deshalb ist in Java z.B. auch von NullPointerExceptions die Rede, wenn bspw. versucht wird, eine Methode eines Objekts aufzurufen, dieses jedoch den Wert null hat. Java führt trotzdem den Begriff Referenzvariable ein, um sich von dem zum Teil unsicheren Gebrauch von Pointern vor allem in C abzugrenzen. Die Verwaltung von Referenzvariablen ist ganz auf Sicherheit und Korrektheit ausgerichtet, Manipulationen von Adresswerten sind nicht möglich.
(Die Verwendung spitzer Klammern in obiger Abbildung kennzeichnet eine Adressangabe.) Als Objekte haben Arrays auch Komponenten, nämlich Attribute und Methoden, über die man mit einer Objektreferenz und dem Punkt-Operator sowie ihrem Namen zugreift. Attribut: int length Methode(n): boolean equals(Object obj) // Prüfung auf Identität von Objektreferenzen, nicht von Arraydaten.
(7) Mehrdimensionale Arrays
Wenn man ein eindimensionales Array als Zeile von Elementen auffasst,
erzielt man mit zwei eindimensionalen Arrays ein zweidimensionales Array aus zwei Zeilen, eine Matrix:
In einer Matrix werden zwei Indizes benötigt, um Zeilen und Spalten und damit Arrayelemente zu indizieren:
Theoretisch ist es egal, ob der erste Index als Zeilen- oder als Spaltenindex interpretiert wird - da dies jedoch das Verständnis von Programmcode nicht erleichtert, gibt es f
- der erste Index indiziert die Zeilen einer Matrix (allg. Darstellungskonvention)
- als Zeilenindex wird üblicherweise i verwendet
- der zweite Index indiziert die Spalten einer Matrix
- als Spaltenindex wird üblicherweise j verwendet
(8) Syntax und Semantik mehrdimensionaler Arrays
Im Vergleich zu
wird einen
nicht verwundern, und nach der abendländischen Lesekonvention von links nach rechts wird einen auch folgendes nicht überraschen:
Eine Matrix besteht also in Java auch syntaktisch (und in der Implementation im Arbeitsspeicher, s.u.) aus eindimensionalen Arrays. Anstelle der Initialisierung mit einem Literal kann man sich ein Matrixobjekt auch mit new beschaffen:
Die Feldelemente einer mit new erzeugten Matrix werden entsprechend dem Feldelementtyp initialisiert, hier mit dem Nullcharacter (Code 0). Im Gegensatz zu anderen Programmiersprachen brauchen zweidimensionale Arrays in Java nicht rechteckig zu sein, sie können aus unterschiedlich langen Zeilen bestehen.
beschafft ein Feld von 2 Referenzen des Typs String[], die mit null intialisiert werden. Man beachte, daß der zweite (letzte) Index im new leer ist. Dies besagt, daß die Daten der einzelnen Zeilen noch nicht erzeugt werden sollen, sondern lediglich eine "leere" Referenz.
belegen nun die Zeilen der "unregelmäßigen Matrix". Es gilt:
- words.length == 2
- words[0].length == 1
- words[1].length == 3
Die Dimension von Arrays ist nicht auf 2 beschränkt, auch 3-dimensionale Arrays oder Arrays mit noch höherer Dimension lassen sich erzeugen.