2015-04-02 3 views
5

У меня естьJava Println (charArray + String) против Println (charArray)

char c1 = 'S';   // S as a character 
char c2 = '\u0068';  // h in Unicode 
char c3 = 0x0065;  // e in hexadecimal 
char c4 = 0154;   // l in octal 
char c5 = (char) 131170; // b, casted (131170-131072=121) 
char c6 = (char) 131193; // y, casted (131193-131072=121) 
char c7 = '\'';   // ' apostrophe special character 
char c8 = 's';   // s as a character 
char[] autoDesignerArray = {c1, c2, c3, c4, c5, c6, c7, c8}; 

И

System.out.println(autoDesignerArray + "Mustang"); 

Выход: [C @ c17164Mustang

System.out.println(autoDesignerArray); 

Выход: Шелби

Я не понимаю, почему я получаю странное o utput, когда я объединяю массив char со строкой. Что такое "[C @ c17164"? Место в памяти? И почему я получаю это, когда я конкатенируюсь со строкой, но я получаю то, что ожидаю, когда печатаю ее в одиночку?

+0

'System.out.println (autoDesignerArray + "Мустанг") и' System.out. println (autoDesignerArray); 'не тот же метод. 'System.out.println' обеспечивает перегрузку, обрабатывающую массив' char' – ortis

ответ

7

Выражение System.out.println(X + Y) равно выражению System.out.println(X.toString() + Y.toString()).

При вызове System.out.println(autoDesignerArray + "Mustang")autoDesignerArray.toString() (который "[[email protected]") объединяется с "Mustang" и результат выводится.

+0

А, это имеет смысл. –

+0

Согласно вашему 2-му пункту Когда вы вызываете System.out.println (autoDesignerArray), необходимо напечатать autoDesignerArray.toString() (который есть «[C @ c17164»), но он печатает Shelby's. Без String конкатенации с массивом печатает фактические данные, но если мы конкатенируем массив со String, тогда он печатает адрес hashcode. – Vikas

+0

@VikasKumarSingh "* В соответствии с вашей второй точкой Когда вы вызываете System.out.println (autoDesignerArray), autoDesignerArray.toString() (который есть« [C @ c17164 ») должен быть напечатан *« не совсем », autoDesignerArray.toString() 'возвращает строку' '[C @ c17164" ', но' println (autoDesignerArray) 'не включает' toString() ', он просто печатает каждый символ из массива. Это возможно, потому что в 'PrintStream' (который' System.out' является экземпляром) существует несколько перегруженных методов 'println', а один из них -' println (char []) '. – Pshemo

0

Массивы в Java не имеют перезаписаны toString() метод, что означает, что:

  1. System.out.println(autoDesignerArray + "Mustang");
    • будет печатать по умолчанию toString() массива и сцепить его со строкой
    • реализации по умолчанию из toString() будет печатать двоичное имя, за которым следует hashCode() (массив символов будет печатать [C, за которым следует его хэш-код)
  2. System.out.println(autoDesignerArray);
    • будет на самом деле назвать Arrays.toString() или аналогичные функциональные возможности обработки на toString() массивов правильно
+1

Я уверен, что второй пункт связан с [этим] (https://docs.oracle.com/javase/8/docs/api /java/io/PrintStream.html#println-char:A-). Также не уверен в первом. – npinti

0

Это связано с массивами и почему тот факт, что они неявно наследуют Object - Для получения дополнительной информации вы можете проверить это SO question (у вас есть ответ).

println(char[] s) делает несколько запутать меня в Oracle Doc - В C вы бы вообще перебирать каждый элемент в массиве и print каждый элемент следует по \n разорвать линию.

Однако все дело в том, что autoDesignerArray.toString() не будет работать так, как вы хотели бы (именно поэтому он возвращает [[email protected]).

2

Поскольку каждый массив имеет класс, строка, которую вы получаете, представляет собой объектное представление объекта i.e.[[email protected] где

  • [C это имя класса ([ представляют 1d массив)
  • @ concates строку
  • c17164 некоторые хэш-код
  • Mustang ваша строка

проверить класс имя массива do System.out.println(yourArray.getClass().getName());

Для ex, если вы делаете System.out.println(new Object());, вы получите что-то вроде [email protected] строковое представление созданного объекта.

И напечатать фактические значения массива делают System.out.println((java.util.Arrays.toString(autoDesignerArray))); который дает

[S, h, e, l, b, y, ', s]

Demo

+0

Спасибо за объяснение другой части вопроса. –

+0

@MikeP мое удовольствие – silentprogrammer

Смежные вопросы