Метод Arrays.toString() в Java - Вопросы
Всего: 5 вопросов
1. Что делает метод Arrays.toString() и как выглядит его результат?
Что делает метод Arrays.toString() и как выглядит его результат?
Статический метод Arrays.toString() из класса java.util.Arrays возвращает строковое представление одномерного массива: элементы перечисляются через запятую с пробелом и заключаются в квадратные скобки. Например, Arrays.toString(new int[]{1, 4, 6, 3, 8}) вернёт строку [1, 4, 6, 3, 8]. Это самый короткий способ вывести массив на консоль — вместо перебора элементов циклом достаточно одного вызова. Метод работает с массивом любого типа: у него девять перегрузок (по одной для каждого из восьми примитивных типов и одна для Object[]). Не забудьте импорт import java.util.Arrays;.
2. Почему System.out.println(array) печатает что-то вроде [I@1b6d3586 вместо элементов массива, и чем от этого отличается Arrays.toString(array)?
Почему System.out.println(array) печатает что-то вроде [I@1b6d3586 вместо элементов массива, и чем от этого отличается Arrays.toString(array)?
Массив в Java — это объект, но метод toString() в нём не переопределён. Поэтому при прямой передаче массива в println() срабатывает реализация по умолчанию из класса Object: она печатает имя типа ([I — одномерный массив int), символ @ и хеш-код в шестнадцатеричном виде. В такой строке нет никакой информации об элементах. Метод Arrays.toString(array) решает эту проблему: он проходит по элементам и собирает читаемую строку вида [1, 4, 6, 3, 8]. Для двумерных массивов та же проблема повторяется на каждом уровне вложенности — там нужен Arrays.deepToString().
3. Когда нужно использовать Arrays.toString(), а когда Arrays.deepToString()?
Когда нужно использовать Arrays.toString(), а когда Arrays.deepToString()?
Arrays.toString() предназначен для одномерных массивов — он выводит элементы одного уровня. Если применить его к двумерному массиву, каждый вложенный массив снова напечатается как тип и хеш-код (например, [I@74a14482), потому что элементы сами являются массивами. Для многомерных (вложенных) массивов нужен Arrays.deepToString(): он рекурсивно раскрывает все уровни вложенности и даёт результат вида [[1, 2, 3], [4, 5, 6]]. Правило простое: одномерный массив — toString(), вложенные массивы — deepToString().
4. Как преобразовать массив в строку без квадратных скобок, со своим разделителем?
Как преобразовать массив в строку без квадратных скобок, со своим разделителем?
Arrays.toString() всегда добавляет квадратные скобки и запятые. Если нужен свой формат (например, для записи в файл), для массива строк используйте String.join(", ", names) — получите Anna, Boris, Clara без скобок. Для массива примитивов подойдёт Stream API: Arrays.stream(array).mapToObj(String::valueOf).collect(Collectors.joining(", ")). Разделитель в обоих случаях может быть любым — дефис, перенос строки, точка с запятой.
5. Что выведет Arrays.toString() для массива объектов вашего класса, и что вернёт метод, если передать ему null?
Что выведет Arrays.toString() для массива объектов вашего класса, и что вернёт метод, если передать ему null?
Arrays.toString() вызывает toString() у каждого элемента массива. Если в вашем классе метод toString() не переопределён, вместо значений полей вы увидите список вида ClassName@хеш-код. Переопределите toString() в классе — и вывод станет читаемым. Если же в метод передать сам null вместо массива, Arrays.toString(null) вернёт строку "null" и не выбросит исключение — это удобно при отладке неинициализированных ссылок.