Java int to String - Integer.toString (i) gegen neue Integer (i) .toString ()

428

Manchmal verwirrt mich Java.
Ich muss eine Menge int- Initialisierungen vornehmen.

Was ist der wahre Unterschied?

  1. Integer.toString(i)
  2. new Integer(i).toString()
marcolopes
quelle
20
Ich würde nur verwenden "" + 42, aber hey, das bin ich. Formular Nr. 2 führt zu einem neuen ganzzahligen Objekt (für die meisten Werte von i) als Zwischenprodukt. Es wird auch mehr getippt.
16
@pst: Wenn das Zwischenobjekt ein Problem für Sie ist, "" + 42ist es nicht besser, da es ein Zwischenprodukt erfordert, StringBuilderdas viel schwerer als ein ist Integer.
Joachim Sauer
47
"" + 42 könnte funktionieren, ist aber eine schlechte Idee. Leute wie ich werden sich Ihren Code ansehen und versuchen herauszufinden, was zum Teufel mit der leeren Zeichenfolge passiert ist.
Mainguy
3
Ich würde es nicht empfehlen, "" + 42da Sie beim Anhängen von Ganzzahlzeichenfolgen möglicherweise die Werte hinzufügen und diese nicht realisieren.
BoltzmannBrain
20
Wenn Sie nicht viel tippen möchten, sollten Sie wahrscheinlich nicht in Java programmieren.
Adam Pierce

Antworten:

548

Integer.toStringruft die statische Methode in der Klasse auf Integer. Es braucht keine Instanz von Integer.

Wenn Sie aufrufen new Integer(i), erstellen Sie eine Instanz vom Typ Integer, bei der es sich um ein vollständiges Java-Objekt handelt, das den Wert Ihres int kapselt. Anschließend rufen Sie die toStringMethode auf, um sie aufzufordern, eine Zeichenfolgendarstellung von sich selbst zurückzugeben .

Wenn Sie nur eine drucken möchten int, verwenden Sie die erste, da sie leichter und schneller ist und keinen zusätzlichen Speicher benötigt (abgesehen von der zurückgegebenen Zeichenfolge).

Wenn Sie möchten, dass ein Objekt einen ganzzahligen Wert darstellt, um es beispielsweise in eine Sammlung aufzunehmen, verwenden Sie das zweite, da es Ihnen ein vollwertiges Objekt bietet, mit dem Sie alle möglichen Dinge ausführen können, die Sie mit einem Bare nicht tun können int.

Jean
quelle
96

new Integer(i).toString()Zuerst wird ein (redundantes) Wrapper-Objekt erstellt i(das selbst ein Wrapper-Objekt sein kann Integer).

Integer.toString(i) wird bevorzugt, da keine unnötigen Objekte erstellt werden.

oksayt
quelle
43

Eine weitere Option ist die statische String.valueOfMethode.

String.valueOf(i)

Es fühlt sich etwas richtiger an als Integer.toString(i)für mich. Wenn sich der Typ von i ändert, z. B. von intbis double, bleibt der Code korrekt.

fhucho
quelle
2
Ja. Es sei denn, Sie müssen RADIX verwenden (in diesem Fall müssen Sie Integer.toString verwenden)
marcolopes
14
  1. new Integer(i).toString();

    Diese Anweisung erstellt das Objekt der Ganzzahl und ruft dann ihre Methoden toString(i)auf, um die String-Darstellung des Integer-Werts zurückzugeben .

  2. Integer.toString(i);

    Es gibt das String-Objekt zurück, das das spezifische int (Ganzzahl) darstellt , aber hier toString(int)ist eine staticMethode.

Die Zusammenfassung gibt im ersten Fall die Zeichenfolgendarstellung des Objekts zurück, während im zweiten Fall die Zeichenfolgendarstellung der Ganzzahl zurückgegeben wird.

Dhiraj
quelle
13

Ich empfehle auch sehr zu verwenden

int integer = 42;
String string = integer + "";

Einfach und effektiv.

Jasper Holton
quelle
38
Dies ist definitiv eine schlechte Form, da beide auf einem ziemlich subtilen Teil der Java-Sprache beruhen und weniger effizient sind als Integer.toString (i). Siehe diese SO post
rickcnagy
Dies könnte ineffizient sein. Ich schlage vor, einige konventionelle Optionen wie Integer.toString oder String.valueOf zu verwenden. Überprüfen Sie hier javadevnotes.com/java-integer-to-string-examples
JavaDev
Es ist im Allgemeinen eine schlechte Idee, Dinge so unintuitiv zu machen. Offensichtlichere Optionen wie Integer.toString()einige zusätzliche Tastenanschläge sind möglicherweise viel klarer, was entscheidend ist, wenn Sie den Code beibehalten möchten.
Calvin Li
Würde dies nicht automatisch die toString()Methode der Ganzzahlvariablen aufrufen ?
Ankit Deshpande
11

Obwohl ich fhuchos Empfehlung von mag

String.valueOf(i)

Die Ironie ist, dass diese Methode tatsächlich aufruft

Integer.toString(i)

Verwenden String.valueOf(i)Sie es daher , wenn Ihnen das Lesen gefällt und Sie kein Radix benötigen, aber auch wissen, dass es weniger effizient ist als Integer.toString(i).

Nathan Waite
quelle
4

Wenn Sie in Bezug auf die Leistungsmessung die Zeitleistung berücksichtigen, dann ist Integer.toString (i); ist teuer, wenn Sie weniger als 100 Millionen Mal anrufen. Wenn es sich um mehr als 100 Millionen Aufrufe handelt, ist die Leistung der neuen Ganzzahl (10) .toString () besser.

Unten ist der Code durch u kann versuchen, die Leistung zu messen,

public static void main(String args[]) {
            int MAX_ITERATION = 10000000;
        long starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s = Integer.toString(10);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("diff1: " + (endtime-starttime));

        starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s1 = new Integer(10).toString();
        }
        endtime = System.currentTimeMillis();
        System.out.println("diff2: " + (endtime-starttime));
    }

In Bezug auf das Gedächtnis, die

neue Ganzzahl (i) .toString ();

benötigt mehr Speicher, da das Objekt jedes Mal erstellt wird, sodass eine Speicherfragmentierung auftritt.

Dhiraj
quelle
2
Ich habe diesen Code in IntelliJ IDEA eingefügt und eine Warnung erhalten: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt
Dieser Code funktioniert für mich. Ich erhalte ungefähr 420 Millisekunden für Integer.toString (10) und 525 Millisekunden für neue Integer (10) .toString ()
Jake Stevens-Haas
Hätte beim Aufwärmen geholfen, sonst sind die Ergebnisse nicht gültig!
Sixones
Wenn Sie sagen, dass einer in einem Fall teuer ist und der andere in dem anderen Fall besser, bedeutet dies, dass der andere in jeder Situation besser / kostengünstiger ist.
Sgene9
2

Besser:

Integer.valueOf(i).toString()
Ryu
quelle
9
Warum ist das besser?
Emile
1
Ich denke, das ist besser, weil @Dhiraj darauf hinwies, dass in Bezug auf den Speicher die "neue Ganzzahl (i) .toString ();" nimmt mehr Speicher in Anspruch, da ein neues Objekt erstellt wird, anstatt nur den Integer-Wert abzurufen und diesen in eine Zeichenfolge zu konvertieren.
Patricia
4
@Lucy Integer.valueOf (i) gibt eine neue Ganzzahl zurück, also gibt es keinen Unterschied
inigoD
Sie geben überhaupt keine Antwort auf die Frage. Die Frage ist, was ist der Unterschied zwischen bla und bla, nicht was ist ein besserer Ersatz für bla.
ahitt6345
2

Einfacher Weg ist nur ""mit Ganzzahl zu verketten :

int i = 100;

String s = "" + i;

Jetzt swird 100als Zeichenfolge Wert.

Shiv Buyya
quelle
1

Hier wird Integer.toStringdie statische Methode in der Klasse Integer aufgerufen. Das Objekt muss nicht aufgerufen werden.

Wenn Sie anrufen new Integer(i) , erstellen Sie zuerst eine Instanz vom Typ Integer, bei der es sich um ein vollständiges Java-Objekt handelt, das den Wert Ihres int i kapselt. Anschließend rufen Sie die toStringMethode auf, um sie aufzufordern, eine Zeichenfolgendarstellung von sich selbst zurückzugeben.

Shailej Shimpi
quelle
0

1.Integer.toString(i)

Integer i = new Integer(8);
    // returns a string representation of the specified integer with radix 8
 String retval = i.toString(516, 8);
System.out.println("Value = " + retval);

2.new Integer(i).toString()

 int i = 506;

String str = new Integer(i).toString();
System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String
Shiva
quelle