2015-07-04 8 views
19

einen char Reihendruck keinen Hash-Code anzeigt:Wenn ein Char-Array ein Objekt in Java ist, warum zeigt das Drucken nicht seinen Hashcode an?

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

output:

[[email protected] 
abc 

Warum ist der Ganzzahl-Array als Hashcode gedruckt und nicht der char Array?

+2

Related: https://StackOverflow.com/Questions/24833562/static-char-and-int-array-difference – Pshemo

+1

Ein weiteres Beispiel, um die vorherigen Antworten zu veranschaulichen: 'System.out.println ((Object) charArray); ' – SJuan76

Antwort

21

Zunächst einmal ist ein char-Array ein Objekt in Java, genau wie jeder andere Array-Typ. Es wird nur anders gedruckt.

PrintStream (die den Typ der System.out Instanz) eine spezielle Version von println für Zeichen-Arrays - public void println(char x[]) - so es muss nicht toString für das Array nennen. Es ruft schließlich public void write(char cbuf[], int off, int len) auf, das die Zeichen des Arrays in dem Ausgabestream schreibt.

Deshalb verhält sich das Aufrufen von println für char[] anders als das Aufrufen für andere Arten von Arrays. Für andere Array-Typen wird die public void println(Object x) Überladung ausgewählt, die String.valueOf(x) aufruft, die x.toString() aufruft, die etwas wie [[email protected] für int-Arrays zurückgibt.

+0

' System.out' ist 'PrintStream' (Ich wünschte, es wäre PrintWriter, aber aufgrund der Konsistenz mit älteren Versionen wurde dieser Typ nicht in writer geändert). – Pshemo

+0

@Phemo oops, danke für den Fehler. – Eran

1

Natürlich Arrays sind Objekte in Java. Egal welche Art von Array es ist. Es ist immer ein Objekt in Java.

Aber so weit wie Ihre Frage betrifft, gibt es eine Methode, println(char[] array), in java.io.PrintStream Klasse, die alle Zeichen aus einem char array druckt. Und das ist der Grund, wenn Sie einen char[] als Parameter zu println() übergeben, ruft es die toString()-Methode der Klasse java.util.Array nicht auf, sondern durchläuft das Array und druckt jedes Zeichen.

Citation:

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

1

System.out tatsächlich gibt Ihnen ein Objekt von PrintStream. und seine println(params) hat einige überladene Methoden, die für verschiedene Arten von params unterschiedlich implementiert werden.

Diese params Wenn ein char[]abc wobei die Ausgabe als char[] Elemente wie System.out.println(charArray); Ausgänge liefert aber nicht die Hashcode, wie im Fall von int[] wie System.out.println(intArray); Ausgänge [[email protected].

PS: - Alle array werden als Object in Java behandelt.

Siehe Official Doc

Außerdem für array Druck, immer die Klasse Arrays Dienstprogramm verwenden. Ihre Methode Arrays.toString() sollte vorzugsweise zum Drucken von array Objekten verwendet werden.

4

Das int-Array ist ein Array von ganzen Zahlen, wobei das char-Array druckbare Zeichen enthält.Der Druckerschreiber hat die Fähigkeit, Zeichenarrays zu drucken, da er die Zeichenfolge ohnehin druckt. Der Drucker druckt sie daher wie eine Zeichenkette, ohne die Methode toString() aufzurufen, um sie in eine Zeichenkette umzuwandeln. Wenn Sie ein int-Array in einen String konvertieren, erhalten Sie einen Hash-Code, der erklärt, warum Sie diese Ausgabe erhalten.

Nehmen Sie dies zum Beispiel:

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

Wenn Sie diese beiden Sequenzen mit der Methode drucken sind Sie verwendet, würde es den Hash-Code des int-Array, gefolgt von ‚123‘ drucken.

3

System.out ist Print, die eine spezielle Methode für char hat [] arg

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

int [] über diese Methode gedruckt wird

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

Diese Antwort ist unvollständig. Was macht die 'print (x)' Methode? –

1

Die anderen Antworten richtig Ihrem Fall einer erklären separater Anruf an PrintStream.println und das gleiche gilt für .print. Ihr Titel könnte jedoch andere Arten des Druckens abdecken. PrintWriter.println und .print UND .write haben char[] Überladungen für einen einfachen Anruf.

jedoch Formatierung nicht über einen Sonderfall:

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

jeweils Ausgänge [[email protected], ähnlich wie die Übergabe von int und anderem Typ-Arrays.

auch nicht Verkettung, verwendet häufig beim Drucken:

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

Ausgänge the value of charArray is [[email protected].

Verwandte Themen