Подтвердить что ты не робот

Если массив 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?

4b9b3361

Ответ 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].