Ich arbeite an einem Projekt, bei dem alle Konvertierungen von int
bis folgendermaßen durchgeführt String
werden:
int i = 5;
String strI = "" + i;
Ich bin nicht mit Java vertraut.
Ist das übliche Praxis oder stimmt etwas nicht, wie ich vermute?
java
string
type-conversion
Denis Palnitsky
quelle
quelle
Integer.valueOf(i).toString()
. Er muss Gegenstände geliebt haben. Während es sehr deutlich seine Absicht ausdrückt, ist es ein bisschen lang für meinen Geschmack.Antworten:
Normale Wege wären
Integer.toString(i)
oderString.valueOf(i)
.Die Verkettung wird funktionieren, ist jedoch unkonventionell und könnte ein schlechter Geruch sein, da der Autor die beiden oben genannten Methoden nicht kennt (was wissen sie sonst möglicherweise nicht?).
Java bietet spezielle Unterstützung für den Operator +, wenn es mit Zeichenfolgen verwendet wird (siehe Dokumentation ), die den von Ihnen geposteten Code in Folgendes übersetzen:
zur Kompilierungszeit. Es ist etwas weniger effizient (
sb.append()
am Ende wird angerufenInteger.getChars()
, wasInteger.toString()
sowieso getan hätte), aber es funktioniert.Zur Beantwortung Grodriguez Kommentar: ** Nein, der Compiler nicht optimieren , um die leere Zeichenfolge in diesem Fall aus - Blick:
Initialisieren Sie den StringBuilder:
Fügen Sie die leere Zeichenfolge hinzu:
Fügen Sie die Ganzzahl hinzu:
Extrahieren Sie die letzte Zeichenfolge:
Es gibt einen Vorschlag und laufende Arbeiten zur Änderung dieses Verhaltens, die auf JDK 9 abzielen.
quelle
"" + 5
wird"5"
)."" + 5
anstatt nur"5"
?"" + integer
Ansatz wird in einem der offiziellen Orakel-Tutorials verwendet .Es ist akzeptabel, aber ich habe so etwas noch nie geschrieben. Ich würde das vorziehen:
quelle
NumberFormatter
ist es da. Sie können Formate wie verwendenNumberFormat.getInstance(Locale.FRENCH)
.Es ist kein guter Weg.
Bei der Konvertierung von int in string sollte Folgendes verwendet werden:
quelle
int i
eine BoxInteger
vor dem Hinzufügen zurString strI
?StringBuilder.append(int)
(undStringBuilder
haben eineappend
Methode für alle primitiven Typen).Es ist nicht nur die Optimierung 1 . Ich mag nicht
weil es nicht ausdrückt, was ich wirklich tun möchte 2 .
Ich möchte keine Ganzzahl an eine (leere) Zeichenfolge anhängen. Ich möchte eine Ganzzahl in einen String konvertieren:
Oder, nicht meine bevorzugte, aber immer noch besser als Verkettung, erhalten Sie eine Zeichenfolgendarstellung eines Objekts (Ganzzahl):
1. Bei Code, der sehr häufig aufgerufen wird, wie in Schleifen, ist die Optimierung sicher auch ein Punkt, an dem keine Verkettung verwendet wird .
2. Dies gilt nicht für die Verwendung einer echten Verkettung wie in
System.out.println("Index: " + i);
oderString id = "ID" + i;
quelle
Viele einführende Universitätskurse scheinen diesen Stil aus zwei Gründen zu lehren (meiner Erfahrung nach):
Es erfordert kein Verständnis der Klassen oder Methoden. Normalerweise wird dies gelehrt, bevor das Wort „Klasse“ jemals erwähnt wird - noch sogar Methodenaufrufe. Die Verwendung von so etwas
String.valueOf(…)
würde die Schüler verwirren.Es ist eine Darstellung der „Betreiber Überlastung“ - in der Tat ist dies für uns als verkauft wurde den idiomatischen überladene Operator (hier kein Wunder, da Java keine benutzerdefinierten Überladen von Operatoren erlauben).
Es kann also entweder aus didaktischen Gründen geboren werden (obwohl ich behaupten würde, dass dies nur eine schlechte Lehre ist) oder verwendet werden, um ein Prinzip zu veranschaulichen, das in Java ansonsten ziemlich schwer zu demonstrieren ist.
quelle
Der Ausdruck
führt zur String-Konvertierung von
i
zur Laufzeit. Der Gesamttyp des Ausdrucks istString
.i
wird zuerst in einInteger
Objekt (new Integer(i)
) konvertiert und dannString.valueOf(Object obj)
aufgerufen. Es ist also gleichbedeutend mitOffensichtlich ist dies etwas weniger performant als nur ein Aufruf,
String.valueOf(new Integer(i))
der das gleiche Ergebnis liefert.Der Vorteil von
""+i
ist, dass das Tippen einfacher / schneller ist und einige Leute denken, dass es einfacher zu lesen ist. Es ist kein Codegeruch, da es kein tieferes Problem anzeigt.(Referenz: JLS 15.8.1 )
quelle
String.valueOf
erforderlichen Boxensi
(dies ist nicht der Fall, da es eine Überlastung gibt, die eine akzeptiertint
), würde es nicht verwendennew Integer(i)
, es würde verwendenInteger.valueOf(i)
. Aber das macht es wirklich nicht. Es tut esnew StringBuilder().append("").append(i).toString()
, wie SimonJs Antwort feststellt. StringBuilder hat eine eigene Logik, um das primitive inti
in einen String umzuwandeln.Persönlich sehe ich in diesem Code nichts Schlechtes.
Dies ist sehr nützlich, wenn Sie einen int-Wert protokollieren möchten und der Logger nur eine Zeichenfolge akzeptiert. Ich würde sagen, eine solche Konvertierung ist praktisch, wenn Sie eine Methode aufrufen müssen, die einen String akzeptiert, aber einen int-Wert haben.
Bei der Wahl zwischen
Integer.toString
oderString.valueOf
ist alles Geschmackssache.... und intern
String.valueOf
ruftInteger.toString
das übrigens die Methode auf. :) :)quelle
Der andere Weg, den ich kenne, ist aus der
Integer
Klasse:Ein konkretes Beispiel (obwohl ich nicht glaube, dass Sie eines brauchen):
Es funktioniert zum Beispiel auch für andere primitive Typen
Double.toString
.Weitere Details finden Sie hier.
quelle
Diese Technik wurde in einem Einführungskurs in Java unterrichtet, den ich vor über einem Jahrzehnt absolviert habe. Ich sollte jedoch beachten, dass wir, IIRC, noch nicht zu den Klassenmethoden String und Integer gekommen sind.
Die Technik ist einfach und schnell zu tippen. Wenn ich nur etwas drucke, werde ich es verwenden (zum Beispiel
System.out.println("" + i);
. Ich denke jedoch, dass dies nicht der beste Weg ist, um eine Konvertierung durchzuführen, da es eine Sekunde dauert, um zu erkennen, was passiert, wenn es verwendet wird Auf diese Weise scheint die Leistung auch langsamer zu sein (siehe unten sowie in anderen Antworten).Persönlich bevorzuge ich Integer.toString (), da es offensichtlich ist, was passiert. String.valueOf () wäre meine zweite Wahl, da es verwirrend zu sein scheint (sehen Sie sich die Kommentare nach Darioos Antwort an).
Nur zum Grinsen :) Ich habe Klassen geschrieben, um die drei Techniken zu testen: "" + i, Integer.toString und String.ValueOf. Bei jedem Test wurden die Ints von 1 auf 10000 in Strings konvertiert. Ich lief dann jeweils durch den Linux Zeit Befehl fünfmal. Integer.toString () war einmal etwas schneller als String.valueOf (), sie wurden dreimal gebunden und String.valueOf () war einmal schneller; Der Unterschied betrug jedoch nie mehr als ein paar Millisekunden.
Die "" + i-Technik war bei jedem Test langsamer als beide, mit einer Ausnahme, wenn sie 1 Millisekunde schneller als Integer.toString () und 1 Millisekunde langsamer als String.valueOf () war (offensichtlich bei demselben Test, bei dem String.valueOf () war schneller als Integer.toString ()). Während es normalerweise nur ein paar Millisekunden langsamer war, gab es einen Test, bei dem es ungefähr 50 Millisekunden langsamer war. YMMV .
quelle
Es gibt verschiedene Möglichkeiten, in Strings zu konvertieren:
quelle
Dies hängt davon ab, wie Sie Ihren String verwenden möchten. Dies kann helfen:
quelle
Meistens auch bei SimonJ. Ich mag die Redewendung "" + i wirklich nicht. Wenn Sie String.valueOf (i) sagen, konvertiert Java die Ganzzahl in einen String und gibt das Ergebnis zurück. Wenn Sie "" + i sagen, erstellt Java ein StringBuilder-Objekt, hängt eine leere Zeichenfolge an, konvertiert die Ganzzahl in eine Zeichenfolge, hängt diese an den StringBuilder an und konvertiert den StringBuilder in eine Zeichenfolge. Das sind viele zusätzliche Schritte. Ich nehme an, wenn Sie es einmal in einem großen Programm tun, ist es keine große Sache. Wenn Sie dies jedoch ständig tun, muss der Computer eine Menge zusätzlicher Arbeit leisten und all diese zusätzlichen Objekte erstellen, die dann bereinigt werden müssen. Ich möchte nicht von der Mikrooptimierung begeistert sein, aber ich möchte auch nicht sinnlos verschwenderisch sein.
quelle
Beide Wege sind richtig.
quelle
Es gibt viele Möglichkeiten, eine Ganzzahl in eine Zeichenfolge umzuwandeln:
1)
2)
3)
4)
quelle
Es gibt drei Möglichkeiten, in Strings zu konvertieren
String string = "" + i;
String string = String.valueOf(i);
String string = Integer.toString(i);
quelle
String.format("%d", i)
.Die Verwendung von "" + i ist die kürzeste und einfachste Möglichkeit, eine Zahl in eine Zeichenfolge umzuwandeln. Es ist nicht das effizienteste, aber es ist meiner Meinung nach das klarste und das ist normalerweise wichtiger. Je einfacher der Code ist, desto weniger wahrscheinlich ist es, dass Sie einen Fehler machen.
quelle
""+i
Persönlich denke ich, dass "" + ich so aussehe, wie das ursprüngliche Frageplakat "stinkend" sagt. Ich habe neben Java viele andere OO-Sprachen verwendet. Wenn diese Syntax angemessen sein sollte, würde Java nur das i alleine interpretieren, ohne dass das "" wie gewünscht in eine Zeichenfolge konvertiert werden müsste, und dies tun, da der Zieltyp eindeutig ist und rechts nur ein einziger Wert angegeben würde . Der andere scheint ein "Trick" zu sein, um den Compiler zum Narren zu halten, ein schlechtes Mojo, wenn verschiedene Versionen von Javac, die von anderen Herstellern oder von anderen Plattformen hergestellt wurden, in Betracht gezogen werden, wenn der Code jemals portiert werden muss Nehmen Sie einen Typecast: (String) i. zwinkert
Aufgrund meiner Art zu lernen und um ein solches Konstrukt beim schnellen Lesen des Codes anderer zu verstehen, stimme ich für die Integer.toString (i) -Methode. Wenn ich ein oder zwei ns vergesse, wie Java Dinge im Hintergrund implementiert, im Vergleich zu String.valueOf (i), fühlt sich diese Methode für mich richtig an und sagt genau, was passiert: Ich habe und Integer und ich möchte, dass sie in einen String konvertiert wird.
Ein guter Punkt, der ein paar Mal gemacht wurde, ist vielleicht, dass die Verwendung von StringBuilder im Vorfeld eine gute Antwort auf das Erstellen von Strings ist, die aus Text und Ints oder anderen Objekten gemischt sind, da dies sowieso im Hintergrund verwendet wird, oder?
Nur meine zwei Cent, die in das bereits gut bezahlte Kätzchen der Antworten auf die Mans-Frage geworfen wurden ... lächelt
BEARBEITEN SIE MEINE EIGENE ANTWORT NACH EINIGER REFLEXION:
Ok, Ok, ich habe noch etwas darüber nachgedacht und String.valueOf (i) ist auch perfekt, heißt es: Ich möchte einen String, der den Wert einer Ganzzahl darstellt. lol, Englisch ist weitaus schwieriger zu analysieren als Java! Aber ich lasse den Rest meiner Antwort / meines Kommentars ... Mir wurde immer beigebracht, wenn möglich die niedrigste Ebene einer Methoden- / Funktionskette zu verwenden und die Lesbarkeit beizubehalten. Wenn String.valueOf Integer.toString aufruft, warum dann eine ganze Orange verwenden? Wenn du es trotzdem schälst, Hmmm?
Um meinen Kommentar zu StringBuilder zu verdeutlichen, baue ich viele Strings mit Kombinationen aus meist wörtlichem Text und Ints und sie werden lang und hässlich mit Aufrufen der oben genannten Routinen, die zwischen den + eingebettet sind, so scheint es mir, wenn diese werden SB-Objekte sowieso und die Append-Methode hat Überladungen. Es könnte sauberer sein, sie einfach zu verwenden ... Also schätze ich, dass ich jetzt bis zu 5 Cent für diese Methode habe, oder? lol ...
quelle
verwenden
Integer.toString(tmpInt).trim();
quelle
trim()
der dies von Nutzen wäre.Versuchen Sie es mit einer einfachen Typografie
quelle
char c = (char) (i + 48);