Если массив char является объектом в Java, почему печать не отображает его хэш-код?
Печать массива char не отображает хеш-код:
class IntChararrayTest{
public static void main(String[] args){
int intArray[] = {0,1,2};
char charArray[] = {'a','b','c'};
System.out.println(intArray);
System.out.println(charArray);
}
}
вывод:
[[email protected]
abc
Почему массив целых чисел печатается как хэш-код, а не массив char?
Ответы
Ответ 1
Прежде всего, массив char - это объект в Java, как и любой другой тип массива. Он просто напечатан по-разному.
PrintStream
(который является типом экземпляра System.out
) имеет специальную версию println
для массивов символов - public void println(char x[])
- поэтому ему не нужно вызывать toString
для этого массива. В итоге он вызывает public void write(char cbuf[], int off, int len)
, который записывает символы массива в выходной поток.
Вот почему вызов println для char[]
ведет себя иначе, чем вызов его для других типов массивов. Для других типов массивов выбирается перегрузка public void println(Object x)
, которая вызывает String.valueOf(x)
, которая вызывает x.toString()
, которая возвращает что-то вроде [[email protected]
для массивов int.
Ответ 2
Массив int представляет собой массив целых чисел, где в качестве массива char символов для печати. Принтер имеет возможность печатать массивы символов, так как в любом случае он печатает строку. Поэтому печатающий редактор будет печатать их как строку, не вызывая метод toString(), чтобы преобразовать его в строку. Преобразование массива int в строку возвращает хеш-код, объясняя, почему вы получаете этот вывод.
Возьмите это, например:
int[] ints = new int[] { 1, 2, 3 };
char[] chars = new char[] { '1', '2', '3' }
Если вы должны были печатать обе эти последовательности с использованием метода, который вы использовали, он печатает хэш-код массива int, а затем '123'.
Ответ 3
System.out - это PrintStream, который имеет специальный метод для char [] arg
public void println(char x[]) {
synchronized (this) {
print(x);
newLine();
}
}
int [] печатается с помощью этого метода
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
Ответ 4
Массивы являются объектами в Java. Независимо от того, какой тип массива он есть. Это всегда объект Java.
Но что касается вашего вопроса, в классе java.io.PrintStream
есть метод println(char[] array)
, который выводит все символы из char array
. И в этом причина, когда вы передаете char[]
в качестве параметра в println()
, он не вызывает метод toString()
класса java.util.Array
, а скорее обходит массив и печатает каждый символ.
Цитирование:
http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(char[])
Ответ 5
System.out
фактически дает вам объект PrintStream
. и его println(params)
имеет несколько перегруженных методов, которые реализованы по-разному для различных типов params
.
Этот params
, если он является char[]
, обеспечивает вывод в виде элементов char[]
, таких как System.out.println(charArray);
, выводит abc
, но не хеш-код, как в случае int[]
, как System.out.println(intArray);
, выводит [[email protected]
.
PS: - Все array
обрабатываются как Object
в Java.
Смотрите Официальный документ
Кроме того, для печати array
всегда используйте служебный класс Arrays
. Его метод Arrays.toString()
предпочтительно использовать для печати объектов array
.
Ответ 6
Другие ответы правильно объясняют ваш случай отдельного вызова PrintStream.println
, и то же самое верно для .print
. Однако ваше название может охватывать другие способы печати. PrintWriter.println
и .print
И .write
имеют char[]
перегрузки для простого вызова.
Однако форматирование не имеет особого случая:
System.out.format ("%s%n", charArray); // or printf
myPrintWriter.format ("%s%n", charArray); // or printf
каждый вывод [[email protected]
, аналогичный передаче int
и других типов массивов.
Также не используется конкатенация, часто используемая при печати:
System.out.println ("the value of charArray is " + charArray);
выходы the value of charArray is [[email protected]
.