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);