2015-04-02 16 views
5

hoJava println (charArray + String) vs 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}; 

E

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

uscita: [C @ c17164Mustang

System.out.println(autoDesignerArray); 

uscita: Shelby di

Non capisco perché ottengo lo strano utput quando concateno il char array con una stringa. Cosa è "[C @ c17164"? La posizione in memoria? E perché lo ottengo quando concatenato con una stringa, ma ottengo quello che mi aspetterei quando lo stampo da solo?

+0

'System.out.println (autoDesignerArray + "Mustang");' e 'System.out. println (autoDesignerArray); 'non sono lo stesso metodo. 'System.out.println' fornisce un sovraccarico che gestisce l'array' char' – ortis

risposta

7

L'espressione System.out.println(X + Y) è uguale all'espressione System.out.println(X.toString() + Y.toString()).

Quando si chiama System.out.println(autoDesignerArray + "Mustang")autoDesignerArray.toString() (che è "[[email protected]") è concatenato con "Mustang" e il risultato viene stampato.

+0

Ah, questo ha senso. –

+0

Secondo il secondo punto Quando si chiama System.out.println (autoDesignerArray) autoDesignerArray.toString() (che è "[C @ c17164") deve essere stampato ma stampa Shelby. Senza la concatenazione di stringhe con matrice viene stampato il dato effettivo ma se concateniamo l'array con String, esso stampa l'indirizzo hashcode. – Vikas

+0

@VikasKumarSingh "* Secondo il vostro secondo punto Quando chiamate System.out.println (autoDesignerArray) autoDesignerArray.toString() (che è" [C @ c17164 ") deve essere stampato *" non proprio, 'autoDesignerArray.toString() 'restituisce stringa' "[C @ c17164" ', ma' println (autoDesignerArray) 'non coinvolge' toString() ', stampa semplicemente ogni carattere dalla matrice. È possibile perché in 'PrintStream' (che' System.out' è l'istanza di) esistono pochi metodi 'println' in sovraccarico, e uno di questi è' println (char []) '. – Pshemo

0

matrici in java non sono sovrascritti toString() metodo, il che significa che:

  1. System.out.println(autoDesignerArray + "Mustang");
    • stamperà predefinito toString() dell'array e concatenare con la stringa
    • l'implementazione predefinita di toString() stamperà il nome binario seguito da hashCode() (il char array stamperà [C seguito dal suo codice hash)
  2. System.out.println(autoDesignerArray);
    • sarà effettivamente chiamare Arrays.toString() o manipolazione funzionalità simile alla toString() di array correttamente
+1

Sono abbastanza sicuro che il secondo punto è dovuto a [questo] (https://docs.oracle.com/javase/8/docs/api /java/io/PrintStream.html#println-char:A-). Inoltre non sono sicuro del primo. – npinti

0

Questo ha a che fare con gli array e perché non ereditano implicitamente Object - Per ulteriori informazioni sentiti libero di dare un'occhiata a questo SO question (avere una risposta lì).

println(char[] s) fa un po 'mi confondono nel Oracle Doc - In C si sarebbe generalmente scorrere ogni elemento all'interno della matrice e print ogni elemento seguire da un \n rompere la linea.

Tuttavia la cosa fondamentale è che il autoDesignerArray.toString() non funzionerà come vorresti (il che è il motivo per cui restituisce [[email protected]).

2

Poiché ogni array ha una classe, la stringa che si ottiene è la rappresentazione dell'oggetto del suo oggetto, vale a dire.[[email protected] dove

  • [C è un nome di classe ([ rappresentano serie 1d)
  • @ concates la stringa
  • c17164 po 'di codice hash
  • Mustang la stringa

per verificare la classe nome dell'array do System.out.println(yourArray.getClass().getName());

Ad esempio se si esegue System.out.println(new Object()); si otterrà qualcosa come [email protected] la rappresentazione di stringa dell'oggetto creato.

E per stampare i valori effettivi di serie fanno System.out.println((java.util.Arrays.toString(autoDesignerArray))); che dà

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

Demo

+0

Grazie per aver spiegato l'altra parte della domanda. –

+0

@MikeP mio piacere – silentprogrammer

Problemi correlati