Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

## 1. Overview

In this tutorial, we’ll get familiar with some ways to print 2D arrays, along with their time and space complexity.

## 2. Common Ways to Print a 2D Array

Java, a versatile programming language, offers multiple methods for handling and manipulating arrays. Specifically, 2D arrays provide a convenient way to organize and store data in a grid-like structure. Printing a 2D array constitutes a common operation, and Java presents several approaches to accomplish this task.

### 2.1. Using Nested Loops

The most straightforward method involves using nested loops to iterate through the rows and columns of the 2D array. This method is simple and intuitive, making it an excellent choice for basic array printing. Let’s look into the implementation:

``````int[][] myArray = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray[i].length; j++) {
System.out.print(myArray[i][j] + " ");
}
}``````

• Simple and easy to understand
• Doesn’t necessitate extra libraries or functionalities

• If prioritizing code brevity, this may not be the optimal selection

Time Complexity: O(m * n), where ‘m’ is the number of rows and ‘n’ is the number of columns in the 2D array

Space Complexity: O(1), constant space as no additional data structures are used

### 2.2. Using Arrays.deepToString()

For simplicity and conciseness, Java provides the Arrays.deepToString() method, which enables printing 2D arrays directly. This method manages nested arrays and furnishes a compact representation of the array contents. Let’s delve into the implementation:

``````int[][] myArray = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
System.out.println(Arrays.deepToString(myArray));``````

• Offers conciseness and demands minimal code
• Appropriate for swift debugging or when accepting a compact output format

• Generates a new string representation of the entire array, potentially less efficient in terms of space complexity for very large arrays
• Lacks control over the array’s formatting and depends on the implementation of the toString

Time Complexity: O(m * n)

Space Complexity: O(m * n), due to the creation of a new string representation of the entire 2D array

### 2.3. Using Java 8 Streams

For a more modern approach, Java 8 introduced streams, allowing concise and expressive code. The Arrays.stream() method can be employed to flatten the 2D array, and then forEach() is used to print the elements. Let’s look into the implementation:

``````int[][] myArray = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
Arrays.stream(myArray)
.flatMapToInt(Arrays::stream)
.forEach(num -> System.out.print(num + " "));``````

• Embraces modernity and expressiveness
• Employs concise code that utilizes Java 8 features

• May be deemed more advanced and could be less readable for individuals unfamiliar with Java 8 streams

Time Complexity: O(m * n)

Space Complexity: O(1), constant space as no additional data structures are used

### 2.4. Using Arrays.toString()

This method is used to convert each row of the 2D array into a string representation and then print each row. This approach provides a clean and concise output. Let’s look into the implementation:

``````int[][] myArray = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
for (int[] row : myArray) {
System.out.print(Arrays.toString(row));
}``````

• Does not create additional data structures like lists or streams, resulting in a more memory-efficient solution
• Straightforward implementation, requiring minimal code to achieve the desired output

• It generates a new string representation of each row, which might be less efficient in terms of space complexity for arrays with a large number of columns.
• We lack control over how the array is formatted, and it depends on the implementation of the toString method of the elements.

Time Complexity: O(m * n)

Space Complexity: O(n), due to the creation of a new string representation of each row

It’s important to note that all these approaches have a time complexity of O(m * n) because to print the entire 2D array, we must visit each element at least once. The space complexity varies slightly based on whether we create additional data structures, such as strings for representation. In general, these complexities are quite reasonable for typical use cases, and the choice of method can depend on factors like code readability, simplicity, and specific project requirements.

## 3. Conclusion

In conclusion, the choice of the “best” approach depends on your specific requirements and coding preferences. For most general use cases, the nested loops approach strikes a good balance between simplicity and efficiency. However, for scenarios where conciseness or customization is a priority, other methods might be more suitable. Java offers flexibility to meet the diverse needs of developers. Choose the method that best fits your coding style and the requirements of your project.

As usual, the source code for all of these examples is available over on GitHub.

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE