2016-04-11 15 views
2

Siehe unten stehenden Code-Schnipsel:Unterschied zwischen String.valueOf (int i) und dem Drucken nur i

int count = 0; 
String query = "getQuery"; 
String query1 = "getQuery"; 
final String PARAMETER = "param"; 

query += "&" + PARAMETER + "=" + String.valueOf(count); 
query1 += "&" + PARAMETER + "=" + count; 
System.out.println("Cast to String=>"+query); 
System.out.println("Without casting=>"+query1); 

Habe die beiden Ausgänge genau gleich. Also ich frage mich, warum dies verwendet wurde, wenn wir das gleiche Ergebnis erhalten, indem wir nur count verwenden.

Ich habe einen Link, aber nicht genau dieselbe Verwirrung gefunden.

+0

Warum erwarten Sie eine andere Ausgabe? –

+1

Wenn Sie ein String-Literal und einen Int (oder einen beliebigen primitiven Typ) verketten, wird das int (oder primitive) automatisch in einen String konvertiert. –

+0

Ich erwarte keine andere Ausgabe, möchte aber wissen, warum dies verwendet wurde. (Wenn eine der Quellen vorhanden ist) – MonsterJava

Antwort

6

Diese im JLS - 15.18.1. String Concatenation Operator + erklärt auch:

Wenn nur ein Operand Ausdruck vom Typ ist String, dann String-Konvertierung (§5.1.11) durchgeführt auf der andere Operand zum Erstellen einer Zeichenfolge zur Laufzeit.

sollten Sie folgendes beachten:

Der + Operator ist syntaktisch linksassoziativen, egal ob es nach Typ-Analyse bestimmt wird String-Verkettung oder numerische zusätzlich zu repräsentieren. In einigen Fällen ist Vorsicht geboten, um das gewünschte Ergebnis zu erhalten.

Wenn Sie schreiben 1 + 2 + " fiddlers" das Ergebnis wird

3 fiddlers 

jedoch sein, schreiben "fiddlers " + 1 + 2 ergibt:

fiddlers 12 
+1

Das ist, was ich suche - ein Verweis auf die JLS. Vielen Dank. 1+ –

1

Java-Compiler spielt einen kleinen Trick, wenn es Betreiber zu einem String+ angewandt sieht und ein nicht-string: es null das Objekt -Checks, ruft toString() auf, und führt dann die String-Verkettung.

Das ist, was passiert, wenn Sie schreiben:

query1 += "&" + PARAMETER + "=" + count; 
//  ^^^ ^^^^^^^^^ ^^^ 

Sie können dies sicherlich tun, wenn die Standard-Konvertierung in String ist das, was Sie wollen.

Wenn Sie jedoch tun, um diese

String s = count; // <<== Error 

der Compiler dies nicht gehen zu kompilieren, weil es keine Verkettung ist. In dieser Situation würden Sie valueOf verwenden:

String s = String.valueOf(count); // <<== Compiles fine 
0

String.valueOf(int)Integer.toString() tatsächlich aufruft.

So wird es verwendet, um eine int in eine Zeichenfolge elegant konvertieren. Als, i+"" ist IMNSHO, nicht ganz elegant.

Darüber hinaus, wenn Sie eine Zahl direkt drucken, ruft es tatsächlich die toString() Methode der Wrapper-Klasse, und das druckt die Zeichenfolge.

Verwandte Themen