Integer.toString(int i) vs. String.valueOf(int i) in Java

Lesezeit: 5 Minuten

Benutzeravatar von Manuel Selva
Manuel Selva

Ich frage mich, warum die Methode String.valueOf(int i) existiert? Ich verwende diese Methode zum Konvertieren int hinein String und gerade die entdeckt Integer.toString(int i) Methode.

Nachdem ich mir die Implementierung dieser Methoden angesehen hatte, sah ich, dass die erste die zweite aufruft. Als Konsequenz alle meine Anrufe an String.valueOf(int i) einen Anruf mehr beinhalten als direkt anrufen Integer.toString(int i)

  • Nur zu Referenzzwecken: stackoverflow.com/questions/3335685/integer-tostring

    – Bobbi

    26. Juli 2010 um 14:25 Uhr

Damian Leszczyński - Benutzeravatar von Vash
Damian Leszczyński – Vash

Im String-Typ haben wir mehrere Methoden valueOf

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

Wie wir sehen können, sind diese Methoden in der Lage, alle Arten von Zahlen aufzulösen

jede Implementierung einer bestimmten Methode, wie Sie sie vorgestellt haben: Also für ganze Zahlen haben wir

Integer.toString(int i)

für doppelt

Double.toString(double d)

usw

Meiner Meinung nach ist dies keine historische Sache, aber es ist nützlicher für einen Entwickler, die Methode zu verwenden valueOf von der String-Klasse als vom richtigen Typ, da wir weniger Änderungen vornehmen müssen, wenn wir den Typ ändern möchten, mit dem wir arbeiten.

Probe 1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

Probe2:

public String doStuff(int num) {
  
 // Do something with num...
 
 return Integer.toString(num);

 }

Wie wir in Beispiel 2 sehen, müssen wir im Gegensatz zu Beispiel 1 zwei Änderungen vornehmen.

In meiner Schlussfolgerung, mit der valueOf Methode aus der String-Klasse ist flexibler und deshalb dort verfügbar.

  • Und nicht vergessen Integer.toString(int i, int radix) die in Zeichenfolgen mit anderen Basen als 10 konvertiert werden.

    – Stefan P

    1. Oktober 2010 um 21:36 Uhr

  • @Vash Könnten Sie bitte auch die Verwendung einer leeren Zeichenfolge zum Konvertieren von int in String im Vergleich zu String.valueOf erläutern? zB) “” + int i = “i” ? Welches das Beste ist ?

    – Kanagavelu Sugumar

    24. September 2013 um 5:31 Uhr

  • Um int als String zu formatieren, sollten Sie das “” + i nicht verwenden. Es gibt keinen großen Overhead, aber im Allgemeinen, weil dies nicht elegant ist. Anstatt zu verwenden String.valueOf(int)können Sie verwenden String.format("%d",i); Um mehr zu lesen, besuchen Sie bitte diese Website docs.oracle.com/javase/6/docs/api/java/util/Formatter.html

    – Damian Leszczyński – Vash

    24. September 2013 um 7:38 Uhr

  • Ich wünschte, Autoboxing wäre klüger und hätte die Konvertierung einfach beim Kompilieren oder so hinzugefügt.

    – Rob Grant

    14. Oktober 2013 um 12:38 Uhr

  • @RobertGrant Das Autoboxing ist hier nicht der Fall. Aber um Ihre Bedenken zu beantworten, ist es klug, wie Sie dies tun können int i = new Integer("1"); und umgekehrt.

    – Damian Leszczyński – Vash

    15. Oktober 2013 um 14:50 Uhr


Der Benutzeravatar von Costa
Ein Costa

Ein großer Unterschied besteht darin, dass Sie aufrufen toString() in einem Null-Objekt erhalten Sie a NullPointerException während mit String.valueOf() Sie dürfen nicht auf null prüfen.

  • Die Frage dreht sich um Integer.toString(int i)A static Methode. Es gibt keine null Objekte möglich.

    – Petr Janeček

    27. Juni 2012 um 12:40 Uhr


  • Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception

    – Manish Singh

    16. Oktober 2012 um 6:25 Uhr


  • @Manis Kumar: Dein Beispiel wird das nicht feuern String.valueOf(int i) Methode aber String.valueOf(Object obj). Wie auch immer, die Frage dreht sich um primitiv int Werte, wo es keine Möglichkeit gibt null.

    – Hleinon

    1. November 2012 um 11:47 Uhr

  • @manish_s Aus dem Beispiel war ziemlich klar, dass niemand über den Objekttyp Integer spricht. Wir reden nur über Primitiven.

    – Daniel Ochoa

    1. März 2016 um 14:14 Uhr

  • @manish_s: Das OP hat es nicht gesagt Integer.toString() Aber Integer.toString(int i). Das ist eine statische Methode (docs.oracle.com/javase/7/docs/api/java/lang/…).

    – LarsH

    7. Dezember 2016 um 3:03 Uhr

Nur zwei verschiedene Möglichkeiten, dasselbe zu tun. Es kann ein historischer Grund sein (ich kann mich nicht erinnern, ob einer vor dem anderen kam).

  • Ja, aber wenn etwas dasselbe tut, heißt das nicht, dass es dasselbe ist.

    – Damian Leszczyński – Vash

    26. Juli 2010 um 15:29 Uhr

  • String.valueOf(int) ruft einfach Integer.toString(i) direkt auf. Rufen Sie also am besten Integer.toString(int) auf.

    – djchapm

    21. Mai 2019 um 16:21 Uhr

Kingos Benutzer-Avatar
König

Die String-Klasse stellt valueOf-Methoden für alle primitiven Typen und Objekttypen bereit, daher gehe ich davon aus, dass es sich um praktische Methoden handelt, auf die alle über eine Klasse zugegriffen werden kann.

NB Profiling-Ergebnisse

Durchschnitt intToString = 5368 ms, Durchschnitt stringValueOf = 5689 ms (für 100.000.000 Operationen)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

Benutzeravatar von Davio
David

Aus den Java-Quellen:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

Sie geben also genau das gleiche Ergebnis und tatsächlich ruft das eine das andere an. String.valueOf ist flexibler, wenn Sie den Typ später ändern.

Benutzeravatar von agabrys
agabrys

Wenn Sie sich den Quellcode für die String Klasse, es ruft tatsächlich Integer.toString() wenn du anrufst valueOf().

Davon abgesehen, Integer.toString() könnte etwas schneller sein, wenn die Methodenaufrufe zur Kompilierzeit nicht optimiert werden (was sie wahrscheinlich sind).

Benutzeravatar von trashgod
Müllgott

Die Implementierung von String.valueOf() die Sie sehen, ist der einfachste Weg, den in der API angegebenen Vertrag zu erfüllen: “Die Repräsentation ist genau diejenige, die von der zurückgegeben wird Integer.toString() Methode eines Arguments.”

1445050cookie-checkInteger.toString(int i) vs. String.valueOf(int i) in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy