⟨info/⟩

int[][]

Mehrdimensional

Ein Array von Arrays — stellt Tabellen, Matrizen und Gitter dar. Jede Zeile ist ein eigenständiges int[]-Array.

Standardwert:0

Visualisierung

int[][]— 2D-Array Visualisierung
matrix[Zeile][Spalte]
[0]
[1]
[2]
[0]
[1]
[2]
1
2
3
4
5
6
7
8
9

3 Zeilen × 3 Spalten — matrix[1][1] = 5 (Mitte)

Deklaration

So reservierst du Speicher für einen int[][].

// Deklaration: [Zeilen][Spalten]
int[][] matrix = new int[3][3];  // 3×3 Matrix, alle 0

// Rechteckig: alle Zeilen gleich lang
int[][] tabelle = new int[4][5]; // 4 Zeilen, 5 Spalten

// Zackig (jagged): unterschiedliche Zeilenlängen
int[][] dreieck = new int[3][];
dreieck[0] = new int[1];   // [0]
dreieck[1] = new int[2];   // [0, 0]
dreieck[2] = new int[3];   // [0, 0, 0]

Initialisierung

Verschiedene Wege, ein int[][] mit Werten zu befüllen.

// Initialisierung einer 3×3 Matrix
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// Schachbrettmuster
int[][] schach = new int[8][8];
for (int z = 0; z < 8; z++) {
    for (int s = 0; s < 8; s++) {
        schach[z][s] = (z + s) % 2; // 0 oder 1 abwechselnd
    }
}

// Einheitsmatrix (Identitätsmatrix)
int n = 4;
int[][] einheit = new int[n][n];
for (int i = 0; i < n; i++) {
    einheit[i][i] = 1; // Diagonale = 1, Rest = 0
}

Typische Operationen

Zugriff, Änderung, Iteration und häufige Patterns mit int[][].

int[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};

// Zugriff: [Zeile][Spalte]
int mitte = matrix[1][1];      // 5

// Dimensionen
int zeilen = matrix.length;     // 3
int spalten = matrix[0].length; // 3

// Iteration mit verschachtelten Schleifen
for (int z = 0; z < matrix.length; z++) {
    for (int s = 0; s < matrix[z].length; s++) {
        System.out.printf("%3d", matrix[z][s]);
    }
    System.out.println();
}
//   1  2  3
//   4  5  6
//   7  8  9

// For-each Variante
for (int[] zeile : matrix) {
    for (int wert : zeile) {
        System.out.print(wert + " ");
    }
}

// Matrix transponieren
int[][] transponiert = new int[3][3];
for (int z = 0; z < 3; z++) {
    for (int s = 0; s < 3; s++) {
        transponiert[s][z] = matrix[z][s];
    }
}

// Matrix-Multiplikation (A × B)
int n = 3;
int[][] a = {{1,2},{3,4}}, b = {{5,6},{7,8}};
int[][] c = new int[2][2];
for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++)
        for (int k = 0; k < 2; k++)
            c[i][j] += a[i][k] * b[k][j];

// Ausgabe
import java.util.Arrays;
System.out.println(Arrays.deepToString(matrix)); // [[1,2,3],[4,5,6],[7,8,9]]

Hintergründe & Details

int[][] ist technisch gesehen ein "Array von Arrays" — kein echter zweidimensionaler Speicherblock wie in C. Jede Zeile ist ein eigenständiges int[]-Objekt. Das erlaubt "jagged arrays" (zackige Arrays), bei denen Zeilen unterschiedliche Längen haben können.

Speicherlayout: Da jede Zeile ein separates Objekt ist, liegen die Zeilen nicht zwingend hintereinander im Speicher. Das kann bei großen Matrizen Cache-Misses verursachen. Für hochperformante Berechnungen nutzt man oft ein 1D-Array mit manueller Indexberechnung: arr[z * spalten + s].

Zeilen-Vorrang (Row-Major): Java-2D-Arrays sind zeilenweise gespeichert. Das bedeutet: matrix[z][s] ist effizient, wenn du in der inneren Schleife über s (Spalten) iterierst — das nutzt den CPU-Cache optimal.

Typische Anwendungsfälle: Schachbretter, Spielfelder, Bilder (Pixel-Gitter), Matrizen in der linearen Algebra, Tabellendaten, Labyrinthe, Dynamic-Programming-Tabellen (z.B. Longest Common Subsequence).

Tipp — Arrays.deepToString(): Arrays.toString() zeigt nur die Zeilenadressen. Für die vollständige Ausgabe eines 2D-Arrays immer Arrays.deepToString(matrix) verwenden.