2015-07-04 11 views
19

Stampa di un array di caratteri non viene visualizzato un codice hash:Se un array di caratteri è un oggetto in Java, perché la stampa non visualizza il suo codice 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); 
    } 
} 

uscita:

[[email protected] 
abc 

Perché la matrice integer stampato come un codice hash e non l'array di caratteri?

+2

Correlato: https://stackoverflow.com/questions/24833562/static-char-and-int-array-difference – Pshemo

+1

Un altro esempio per ilustrate le risposte precedenti: 'System.out.println ((Object) charArray); ' – SJuan76

risposta

21

Prima di tutto, un array di caratteri è un oggetto in Java proprio come qualsiasi altro tipo di array. È solo stampato in modo diverso.

PrintStream (che è il tipo dell'istanza System.out) presenta una versione speciale di println per array di caratteri - public void println(char x[]) - quindi non dover chiamare toString per quella matrice. Alla fine chiama public void write(char cbuf[], int off, int len), che scrive i caratteri della matrice sul flusso di output.

Ecco perché chiamare println per un char[] si comporta diversamente dal chiamarlo per altri tipi di array. Per altri tipi di array, viene scelto il sovraccarico public void println(Object x), che chiama String.valueOf(x), che chiama x.toString(), che restituisce qualcosa come [[email protected] per i vettori int.

+0

' System.out' è 'PrintStream' (vorrei che fosse PrintWriter, ma a causa della coerenza con le versioni precedenti questo tipo non è stato modificato in writer). – Pshemo

+0

@Pshemo oops, grazie per aver colto l'errore. – Eran

1

Gli array di azioni sono oggetti in Java. Non importa che tipo di array sia. È sempre un oggetto in Java.

Ma per quanto riguarda la domanda, esiste un metodo, println(char[] array), nella classe java.io.PrintStream che stampa tutti i caratteri da char array. E questo è il motivo, quando si passa un char[] come parametro a println(), non chiama il metodo toString() della classe java.util.Array, ma piuttosto scorre attraverso l'array e stampa ogni carattere.

Citation:

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

1

System.out in realtà ti dà un oggetto di PrintStream. e il suo println(params) ha alcuni metodi di overload che vengono implementati in modo diverso per il diverso tipo di params.

Questo params se essere char[] fornisce l'uscita come char[] elementi come System.out.println(charArray); uscite abc ma non hashCode come nel caso di int[] come System.out.println(intArray); uscite [[email protected].

PS: - Tutti gli array sono trattati come Object in Java.

Vedi l'Official Doc

Inoltre, per la stampa array, utilizzare sempre la classe Arrays di utilità. Il metodo Arrays.toString() deve essere utilizzato preferibilmente per la stampa di oggetti array.

4

L'array int è una matrice di numeri interi in cui come matrice di caratteri stampabili caratteri.Il printwriter ha la capacità di stampare array di caratteri poiché questo è il modo in cui stampa la stringa comunque. Il printwriter quindi li stamperà come una stringa, senza chiamare il metodo toString() per convertirlo in una stringa. Convertire un array int in una stringa restituisce un codice hash, spiegando il motivo per cui si ottiene quell'output.

Prendete questo ad esempio:

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

Se si dovesse stampare entrambe quelle sequenze con il metodo che hai utilizzato, sarebbe stampare il codice hash della matrice int seguito da '123'.

3

System.out è PrintStream che ha un metodo speciale per char [] arg

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

int [] viene stampato tramite questo metodo

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

Questa risposta è incompleta. Che cosa fa il metodo 'print (x)'? –

1

Le altre risposte spiegano correttamente il caso di un chiamata separata a PrintStream.println e lo stesso vale per .print. Tuttavia il tuo titolo potrebbe coprire altri modi di stampare. PrintWriter.println e .print E .write hanno sovraccarichi char[] per una semplice chiamata.

Tuttavia, la formattazione non ha un caso speciale:

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

ciascuna uscita [[email protected], simile alla consegna di int e altri array di tipo.

Né concatenazione, spesso usato nella stampa:

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

uscite the value of charArray is [[email protected].

Problemi correlati