Java: println с массивом char дает тарабарщину

Вот проблема. Этот код:

String a = "0000";
 System.out.println(a);
char[] b = a.toCharArray();
 System.out.println(b);

возвращает

0000
0000


Но этот код:

String a = "0000";
 System.out.println("String a: " + a);
char[] b = a.toCharArray();
 System.out.println("char[] b: " + b);

возвращает

String a: 0000
char[] b: [[email protected]


Что в мире происходит? Кажется, должно быть достаточно простое решение, но я не могу понять это.

Ответы

Ответ 1

Когда вы говорите

System.out.println(b);

Это приводит к вызову print(char[] s), затем println()

JavaDoc для print(char[] s) говорит:

Вывести массив символов. Символы преобразуются в байты в соответствии с кодировкой символов по умолчанию платформы, и эти байты записываются точно так же, как метод write (int).

Таким образом, он выполняет печать побайтно.

Когда вы говорите

System.out.println("char[] b: " + b);

Это приводит к вызову print(String), и поэтому то, что вы на самом деле делаете, добавляет к String a Object, который вызывает toString() на Object - это, как и все Object по умолчанию, а в случае Array печатает значение ссылки (адрес памяти).

Вы можете сделать:

System.out.println("char[] b: " + new String(b));

Обратите внимание, что это "неправильно" в том смысле, что вы не обращаете никакого внимания на кодирование и используете системный дефолт. Узнайте о кодировке раньше, чем позже.

Ответ 2

System.out.println("char[] b: " + b);

Это похоже на

System.out.println(("char[] b: " + b.toString());

Вы можете посмотреть "Object.toString()"

Ответ 3

Используйте

System.out.println("char[] b: " + Arrays.toString(b));

Получаемая вами Gibrish - это имя класса, за которым следует адрес памяти объекта. Проблема возникает, если вы пытаетесь добавить b со строкой char[] b:, в этом случае вызывается метод b.toString() массива char, поэтому [C @56e5b723 печатается.

[указывает, что это массив C указывает класс в этом случае char @56e5b723 указывает расположение памяти

Ответ 4

Метод array toString() (который вызывается при выполнении "..." + b) предназначен только для вывода отладочной информации. Нет специального случая, когда char[] toString() предоставит вам исходные строковые массивы всех типов, имеющих ту же реализацию toString().

Если вы хотите получить исходную строку из массива char, используйте:

String a2 = new String(b);

Ответ 5

Использование 3: e строка!

Scanner input = new Scanner(System.in);
char[] txt = input.next().toCharArray();
System.out.println((char[])txt);