2D Arrays

We can declare 2-dimensional arrays as follows.

```int[][] m1 = new int[3][3];
```

Here m1 has 3 rows, each of length 3.  You can also declare a multi-dimensional array with rows of a length different than the number of columns.  Below m2 has 2 rows, each of length 3.

```int[][] m2 = new int[2][3];
```

2D arrays are just arrays of arrays. So we can do the following.

```m2[0] = new int[3];
m2[1] = new int[3];
```

You can also initialize a multi-dimensional array when it is declared.  Here is a 2D array whose rows are of different lengths.

```int[][] matrix = {
{1, 0, 0},
{0, 1},
{1}
};
```

Iterating Over a 2D Array

We can iterate over the elements of a 2D array using nested for-loops.  If we don’t need to modify the values stored in the matrix, since 2D arrays are just arrays of arrays we can use for-each loops as shown below.

```for (int[] arr:  matrix) {
for (int elm : arr) {
System.out.printf("%d ", elm);
}
}
```

If we need to modify the values stored in the matrix we can use a regular for-loop and iterate over the indices of the matrix.

```for(int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (i == j) {
matrix[i][j] = 1;
}
}
}
```