Метод Arrays.deepToString() в Java
Метод Arrays.deepToString() в Java возвращает строковое представление многомерного массива: он рекурсивно обходит вложенные массивы и выделяет каждый уровень квадратными скобками. Это самый короткий способ вывести двумерный или многомерный массив в консоль без циклов. Метод объявлен в классе java.util.Arrays:
public static String deepToString(Object[] a) Пример: двумерный массив в строку
Передадим методу двумерный массив строк — Arrays.deepToString() вернёт содержимое обоих уровней вложенности:
import java.util.Arrays;
public class ArraysDeepToStringExample {
public static void main(String[] args) {
String[][] array = {{"один-один", "один-два", "один-три"},
{"два-один", "два-два", "два-три"}};
System.out.println(Arrays.deepToString(array));
}
} Вывод программы:
[[один-один, один-два, один-три], [два-один, два-два, два-три]] Внешние скобки соответствуют всему массиву, внутренние — каждой его строке. Метод работает с любой глубиной вложенности: трёхмерный массив даст три уровня скобок, и так далее.
Отличие от Arrays.toString()
У класса Arrays есть похожий метод — Arrays.toString(). Он обходит только первый уровень массива: каждый элемент преобразуется вызовом его собственного toString(). Для двумерного массива элементами первого уровня являются вложенные массивы, а массивы не переопределяют toString() — поэтому вместо содержимого печатаются тип и хеш-код:
String[][] array = {{"один-один", "один-два"}, {"два-один", "два-два"}};
System.out.println(Arrays.toString(array));
System.out.println(Arrays.deepToString(array)); Вывод программы:
[[Ljava.lang.String;@1b6d3586, [Ljava.lang.String;@4554617c]
[[один-один, один-два], [два-один, два-два]] | Метод | Принимает | Как обходит | Когда использовать |
|---|---|---|---|
| Arrays.toString() | Одномерный массив (примитивы или объекты) | Только первый уровень | Вывести одномерный массив |
| Arrays.deepToString() | Object[] (в том числе int[][], String[][]) | Рекурсивно, все уровни вложенности | Вывести двумерный и многомерный массив |
Массивы примитивов
Двумерный массив примитивов, например int[][], передать в deepToString() можно: его элементы первого уровня — это объекты типа int[], поэтому такой массив совместим с параметром Object[]:
int[][] matrix = {{1, 2, 3}, {4, 5, 6}};
System.out.println(Arrays.deepToString(matrix)); Вывод программы:
[[1, 2, 3], [4, 5, 6]] Важно
Одномерный массив примитивов передать в deepToString() нельзя: Arrays.deepToString(new int[]{1, 2, 3}) не скомпилируется, потому что int[] не приводится к Object[]. Для одномерных массивов используйте перегрузки Arrays.toString() — они есть для всех примитивных типов.
null и самоссылающиеся массивы
Метод аккуратно обрабатывает граничные случаи, на которых «ручной» рекурсивный вывод обычно падает:
- если аргумент равен
null, возвращается строка"null"; - вложенные
null-элементы также печатаются какnull; - если массив прямо или косвенно содержит ссылку на самого себя, вместо бесконечной рекурсии на этом месте выводится
"[...]".
Object[] selfRef = new Object[2];
selfRef[0] = "первый";
selfRef[1] = selfRef; // массив ссылается сам на себя
System.out.println(Arrays.deepToString(selfRef)); Вывод программы:
[первый, [...]] Для сравнения и хеширования многомерных массивов в классе Arrays есть парные методы с той же «глубокой» семантикой — Arrays.deepEquals() и Arrays.deepHashCode().
Часто задаваемые вопросы
Чем Arrays.deepToString() отличается от Arrays.toString()?
Arrays.toString() обходит только первый уровень массива, поэтому для двумерного массива печатает тип и хеш-код вложенных массивов. Arrays.deepToString() обходит массив рекурсивно и выводит содержимое всех уровней вложенности.
Можно ли передать в deepToString() одномерный массив int[]?
Нет, код не скомпилируется: метод принимает Object[], а массив примитивов int[] к этому типу не приводится. Для одномерного массива примитивов используйте Arrays.toString(). При этом int[][] передать можно — его элементы первого уровня сами являются объектами.
Как вывести двумерный массив в Java без deepToString()?
Вложенными циклами for: внешний идёт по строкам, внутренний по элементам строки. Либо одним циклом по строкам, печатая каждую через Arrays.toString(row) — так каждая строка матрицы выводится с новой строки, что удобнее для больших таблиц.
Что вернёт deepToString(), если массив содержит null или ссылается сам на себя?
Для аргумента null метод возвращает строку "null", вложенные null-элементы печатаются как null. Если массив содержит ссылку на самого себя, вместо бесконечной рекурсии на этом месте выводится "[...]".
Video Explanation
Prefer video format? Watch this lesson with examples and explanations.
Comments