Wie konvertiere ich von int nach String?


745

Ich arbeite an einem Projekt, bei dem alle Konvertierungen von intbis folgendermaßen durchgeführt Stringwerden:

int i = 5;
String strI = "" + i;

Ich bin nicht mit Java vertraut.

Ist das übliche Praxis oder stimmt etwas nicht, wie ich vermute?


47
Der "dumme, einfache" Weg ist string = "" + integer;
Fattie


2
Ich meinte nur, es ist eine "schnelle, einfache" Möglichkeit, dies zu tun. Es ist ein bisschen albern, aber es funktioniert!
Fattie

1
Ein Kollege von mir hat es getan 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.
Ole VV

5
Sie benötigen nur 45 Codezeilen und implementieren dafür 7 Schnittstellen.
Ska

Antworten:


958

Normale Wege wären Integer.toString(i)oder String.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:

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();

zur Kompilierungszeit. Es ist etwas weniger effizient ( sb.append()am Ende wird angerufen Integer.getChars(), was Integer.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:

simon@lucifer:~$ cat TestClass.java
public class TestClass {
  public static void main(String[] args) {
    int i = 5;
    String strI = "" + i;
  }
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    iconst_5
   1:    istore_1

Initialisieren Sie den StringBuilder:

   2:    new    #2; //class java/lang/StringBuilder
   5:    dup
   6:    invokespecial    #3; //Method java/lang/StringBuilder."<init>":()V

Fügen Sie die leere Zeichenfolge hinzu:

   9:    ldc    #4; //String
   11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;

Fügen Sie die Ganzzahl hinzu:

   14:    iload_1
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;

Extrahieren Sie die letzte Zeichenfolge:

   18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   21:    astore_2
   22:    return
}

Es gibt einen Vorschlag und laufende Arbeiten zur Änderung dieses Verhaltens, die auf JDK 9 abzielen.


9
Was ist mit JIT Compiler in JVM? :-) javac macht keine ausgefallenen optimierungen.
Peter Štibraný

5
Wer weiß :) javac optimiert diese Art von Ausdrücken, wenn numerische Literale verwendet werden (z . B. "" + 5wird "5").
SimonJ

5
Ja, aber warum würdest du das tun "" + 5anstatt nur "5"?
Grungondola

3
Nett! +1 für was könnten sie sonst noch nicht wissen?
Sнаđошƒаӽ


252

Es ist akzeptabel, aber ich habe so etwas noch nie geschrieben. Ich würde das vorziehen:

String strI = Integer.toString(i);

101
Ich bevorzuge den String.valueOf-Ansatz, da Sie für jeden Typ genau denselben Aufruf verwenden können.
Jon Skeet

1
NumberFormatter wäre ein besserer Ansatz
Kasturi

Eine gute Antwort, Kasturi. Ich würde es als etwas mehr als einen Kommentar posten.
Duffymo

2
Entschuldigen Sie meine Unwissenheit, aber würde dies nicht die aktuelle Kultur nutzen? Ich komme übrigens aus einem .NET-Hintergrund.
О Г И І І

3
Für eine Ganzzahl werden standardmäßig keine kulturspezifischen Elemente verwendet (es gibt überhaupt kein Dezimal- oder Tausendertrennzeichen). Dafür NumberFormatterist es da. Sie können Formate wie verwenden NumberFormat.getInstance(Locale.FRENCH).
Kat

111

Es ist kein guter Weg.

Bei der Konvertierung von int in string sollte Folgendes verwendet werden:

int i = 5;
String strI = String.valueOf(i);

7
1. Sie fragen nach der leeren Zeichenfolge. 2. Sie bitten um Verkettung; 3. Da Sie keine Zeichenfolge haben, konvertieren Sie Ihr int schließlich in eine Zeichenfolge. Die Lösung von Daridoo vermeidet die ersten Schritte.
Nicolas

Wird int ieine Box Integervor dem Hinzufügen zur String strI?
Kevin Meredith

1
@ KevinMeredith, nein, das tut es nicht. Sie würden tatsächlich aufrufen StringBuilder.append(int)(und StringBuilderhaben eine appendMethode für alle primitiven Typen).
Kat

60

Es ist nicht nur die Optimierung 1 . Ich mag nicht

"" + i

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:

Integer.toString(i)

Oder, nicht meine bevorzugte, aber immer noch besser als Verkettung, erhalten Sie eine Zeichenfolgendarstellung eines Objekts (Ganzzahl):

String.valueOf(i)

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); oder String id = "ID" + i;


3
Die Leute, die in diesem Zusammenhang über Leistung sprechen, sind eine Ablenkung. Weit, weit, weit, weit, weit, weit wichtiger ist die Lesbarkeit .
Brian Goetz

23

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.


2
Ich denke, dass im Gegenteil Konstruktionen wie "" + ich Neulinge verwirren würde. Und es ist auch ein schlechter Stil für den Rest ihres Lebens.
Konstantin Zyubin

15

Der Ausdruck

"" + i

führt zur String-Konvertierung von izur Laufzeit. Der Gesamttyp des Ausdrucks ist String. iwird zuerst in ein IntegerObjekt ( new Integer(i)) konvertiert und dann String.valueOf(Object obj)aufgerufen. Es ist also gleichbedeutend mit

"" + String.valueOf(new Integer(i));

Offensichtlich ist dies etwas weniger performant als nur ein Aufruf, String.valueOf(new Integer(i))der das gleiche Ergebnis liefert.

Der Vorteil von ""+iist, 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 )


3
Ihre "äquivalente" Aussage ist nicht äquivalent. Selbst wenn das Aufrufen des String.valueOferforderlichen Boxens i(dies ist nicht der Fall, da es eine Überlastung gibt, die eine akzeptiert int), würde es nicht verwenden new Integer(i), es würde verwenden Integer.valueOf(i). Aber das macht es wirklich nicht. Es tut es new StringBuilder().append("").append(i).toString(), wie SimonJs Antwort feststellt. StringBuilder hat eine eigene Logik, um das primitive int iin einen String umzuwandeln.
Mark Peters

4
Der Teil über den Code-Geruch ist jedoch richtig; Codegeruch ist hier der falsche Begriff. Also werde ich die Abstimmung ablehnen.
Mark Peters

Scheint ineffizient, es mit "" + i zu tun. Es wird nur einfaches Integer.toString oder String.valueOf empfohlen. Siehe javadevnotes.com/java-integer-to-string-examples
JavaDev

14

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.toStringoder String.valueOfist alles Geschmackssache.
... und intern String.valueOfruft Integer.toStringdas übrigens die Methode auf. :) :)


12

Der andere Weg, den ich kenne, ist aus der IntegerKlasse:

Integer.toString(int n);
Integer.toString(int n, int radix);

Ein konkretes Beispiel (obwohl ich nicht glaube, dass Sie eines brauchen):

String five = Integer.toString(5); // returns "5"

Es funktioniert zum Beispiel auch für andere primitive Typen Double.toString.

Weitere Details finden Sie hier.


9

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 .


1
Vergessen Sie nicht, die JIT zu berücksichtigen - die ersten Konvertierungen sind viel langsamer und verzerren das Timing. Auf meinem MacBook dauert die Verkettung ~ 20 ns länger als bei den beiden anderen Methoden (die beide ~ 50 ns pro Konvertierung benötigen), sodass die Unterschiede, die Sie in der Reihenfolge von ms gesehen haben, wahrscheinlich auf zufällige Fehler (Zeitplanung, Interrupts usw.) zurückzuführen sind.
SimonJ

6

Es gibt verschiedene Möglichkeiten, in Strings zu konvertieren:

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

StringBuilder string = string.append (i) .toString (); ... Hm, ist es also der StringBuilder oder ein String? Etwas Chaos hier ...
Franta

6

Dies hängt davon ab, wie Sie Ihren String verwenden möchten. Dies kann helfen:

String total =  Integer.toString(123) + Double.toString(456.789);

5

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.


5
String strI = String.valueOf(i);

String string = Integer.toString(i);

Beide Wege sind richtig.


5

Es gibt viele Möglichkeiten, eine Ganzzahl in eine Zeichenfolge umzuwandeln:

1)

Integer.toString(10);

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)

3)

String thousand = "" + 1000; // String concatenation

4)

String million = String.format("%d", 1000000)

1
String.format ("% d", 1000000) ... Dies ist nicht wirklich Int >> String-Konvertierung, sondern eher String >> String-Verarbeitung hier, trotz Überlastung. Also empfehle ich das nicht. Auf keinen Fall nur zum Zwecke einer Konvertierung.
Franta

5

Es gibt drei Möglichkeiten, in Strings zu konvertieren

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);

1
Du hast vergessen : String.format("%d", i).
Brian Goetz

3

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.


2
Wie würde man beim Aufrufen von String.valueOf oder Integer.toString einen Fehler machen?
Eva

1
Ich bin auf einige nicht ideale Verwendungen von String.valueOf () gestoßen, kann mich aber jetzt nicht an sie erinnern. Während die Ausgabe korrekt war, war sie weniger effizient als""+i
Peter Lawrey

2

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 ...



-5

Versuchen Sie es mit einer einfachen Typografie

char c = (char) i;

3
Dies ist keine gute Möglichkeit, ein int in einen String zu konvertieren. Tatsächlich konvertieren Sie kein int in einen String, sondern ein int in ein Zeichen. Dadurch wird das int als ASCII-Zeichencode interpretiert und Sie erhalten dieses Zeichen. Es ist gefährlich (negative Werte usw.) und insgesamt einfach falsch.
Nepoxx

Bitte klären Sie die obige Frage, char und String sind beide unterschiedlich ...!

Das funktioniert aber (ASCII - Zeichensatz "Offset"):char c = (char) (i + 48);
electrobabe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.