Complete the Enhanced for loop exercises before reviewing the solutions.
Review the exercise 6 solution with AP CS Tutor Brandon Horn.
Original code
int[][] matrix = {
{10, 11, 12},
{13, 14, 15}
};
for(int[] row : matrix)
{
for(int i = 0; i < row.length; i++)
{
System.out.print(row[i] + " ");
row[i] = -99;
System.out.println(row[i]);
}
}
System.out.println(Arrays.deepToString(matrix));
Output
10 -99
11 -99
12 -99
13 -99
14 -99
15 -99
[[-99, -99, -99], [-99, -99, -99]]
Explanation
A 2D array is an array of references to 1D arrays. Each time the outer loop runs, row
is set to a reference to a 1D array in matrix
.
Each time the inner loop runs, i
is set to an index in row
. matrix
and row
point to the same 1D array. Changes to the values in row
change the values in matrix
.
Step 1
int[][] matrix = {
{10, 11, 12},
{13, 14, 15}
};
// more code not yet run
Memory diagram after Step 1
This is the same initial state as in Exercise 4 Step 1 and Exercise 5 Step 1.
Step 2
int[][] matrix = {
{10, 11, 12},
{13, 14, 15}
};
for(int[] row : matrix)
{
for(int i = 0; i < row.length; i++)
{
System.out.print(row[i] + " ");
// more code not yet run
}
}
// more code not yet run
Step 2 is inside the inner loop, immediately after the print
statement has been run.
Memory diagram after Step 2
This step diverges significantly from Exercises 4 & 5. At this step, row
points the same array as matrix[0]
.
i
stores 0
, and represents an index in the array to which row
points.
Since each 1D array to which matrix
points represents a row in the 2D array, i
can also be thought of as a column index.
Output after Step 2
10
The print
statement prints row[0]
, which stores 10
.
Step 3
int[][] matrix = {
{10, 11, 12},
{13, 14, 15}
};
for(int[] row : matrix)
{
for(int i = 0; i < row.length; i++)
{
System.out.print(row[i] + " ");
row[i] = -99;
System.out.println(row[i]);
}
}
// more code not yet run
Step 3 is inside the first iteration of the inner loop, immediately after the println
statement has been run.
Memory diagram after Step 3
The statement row[i] = -99;
changes the value at position i
(0
at this step) in the array to which row
points to -99
. row points to the same array as matrix[0]. Changes to the values in row
change the values in matrix
.
This is similar to Exercise 3. All arrays in Java are objects. A variable of array type stores the memory address of the array object (the arrow). Changing a value within an array is equivalent to running a mutator method on an object.
Output after Step 3
10 -99
The print
statement prints row[0]
, which stores 10
.
Step 4
int[][] matrix = {
{10, 11, 12},
{13, 14, 15}
};
for(int[] row : matrix)
{
for(int i = 0; i < row.length; i++)
{
System.out.print(row[i] + " ");
row[i] = -99;
System.out.println(row[i]);
}
}
System.out.println(Arrays.deepToString(matrix));
Step 4 is after the entire code segment has executed.
Memory diagram after Step 4
All of the values in matrix
have been changed to -99
.
The scope of row
is the outer loop. The scope of i
is the inner loop. Neither variable exists after the outer loop finishes.
Output after Step 4
10 -99
11 -99
12 -99
13 -99
14 -99
15 -99
[[-99, -99, -99], [-99, -99, -99]]
All of the values in matrix
are -99
.