Si una matriz char es un objeto en Java, ¿por qué la impresión no muestra su código hash?

Imprimir una matriz char no muestra un código hash:

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

salida:

 [I@19e0bfd abc 

¿Por qué la matriz de enteros se imprime como un código hash y no como la matriz de caracteres?

En primer lugar, una matriz char es un objeto en Java como cualquier otro tipo de matriz. Simplemente se imprime de manera diferente.

PrintStream (que es el tipo de la instancia System.out ) tiene una versión especial de println para matrices de caracteres – public void println(char x[]) – por lo que no tiene que llamar toString para esa matriz. Finalmente llama a public void write(char cbuf[], int off, int len) , que escribe los caracteres de la matriz en la secuencia de salida.

Es por eso que llamar a println para un char[] comporta de manera diferente que llamarlo para otros tipos de matrices. Para otros tipos de matriz, se elige la sobrecarga public void println(Object x) , que llama a String.valueOf(x) , que llama a x.toString() , que devuelve algo como [I@19e0bfd para int arrays.

La matriz int es una matriz de enteros donde está la matriz char de caracteres imprimibles . El impresor tiene la capacidad de imprimir matrices de caracteres, ya que así es como imprime la cadena de todos modos. El impresor los imprimirá como una cadena, sin llamar al método toString () para convertirlo en una cadena. La conversión de una matriz int a una cadena devuelve un código hash, que explica por qué obtiene esa salida.

Toma esto por ejemplo:

 int[] ints = new int[] { 1, 2, 3 }; char[] chars = new char[] { '1', '2', '3' } 

Si imprimiera ambas secuencias con el método que utilizó, imprimiría el código hash de la matriz int seguido de ‘123’.

System.out es PrintStream que tiene un método especial para char [] arg

 public void println(char x[]) { synchronized (this) { print(x); newLine(); } } 

int [] se imprime mediante este método

 public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } } 

Por supuesto, las matrices son objetos en Java. No importa de qué tipo de matriz se trate. Siempre es un objeto en Java.

Pero en lo que respecta a su pregunta, hay un método, println(char[] array) , en la clase java.io.PrintStream que imprime todos los caracteres de una char array . Y esa es la razón, cuando pasas un char[] como parámetro para println() , no llama al método toString() de la clase java.util.Array , sino que recorre el conjunto e imprime cada carácter .

Citación:

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println (char [])

System.out realmente le da un objeto de PrintStream . y su println(params) tiene algunos métodos sobrecargados que se implementan de manera diferente para diferentes tipos de params .

Este params si ser un char[] proporciona la salida como elementos char[] como System.out.println(charArray); genera abc pero no el código hash como en el caso de int[] como System.out.println(intArray); salidas [I@19e0bfd .

PD: – Toda la array se trata como Object en Java.

Ver el documento oficial

Además, para imprimir array , siempre use la clase de utilidad Arrays . Su método Arrays.toString() debería usarse preferiblemente para imprimir objetos de array .

Las otras respuestas explican correctamente su caso de una llamada separada a PrintStream.println y lo mismo es cierto para .print . Sin embargo, su título podría abarcar otras formas de impresión . PrintWriter.println y PrintWriter.println AND .write tienen sobrecargas char[] para una llamada simple.

Sin embargo, el formateo no tiene un caso especial:

  System.out.format ("%s%n", charArray); // or printf myPrintWriter.format ("%s%n", charArray); // or printf 

cada salida [C@hash , similar a la entrega de int y otras matrices de tipo.

Tampoco lo hace la concatenación, a menudo utilizada en la impresión:

  System.out.println ("the value of charArray is " + charArray); 

the value of charArray is [C@hash .