Java int a String - Integer.toString (i) vs new Integer (i) .toString ()


428

A volte java mi confonde.
Ho una grande quantità di inizializzazioni int da fare.

Qual è la vera differenza?

  1. Integer.toString(i)
  2. new Integer(i).toString()

20
Vorrei solo usare "" + 42, ma ehi, sono io. Il modulo n. 2 genererà un nuovo oggetto intero (per la maggior parte dei valori di i) come intermedio. Inoltre sta scrivendo di più.

16
@pst: se l'oggetto intermedio è un problema per te, allora "" + 42non è meglio, in quanto richiede un intermedio StringBuilderche è molto più pesante di un Integer.
Joachim Sauer,

47
"" + 42 potrebbe funzionare, ma è una cattiva idea. Persone come me verranno a vedere il tuo codice e cercheranno di capire cosa diavolo è successo alla stringa vuota.
Mainguy,

3
Non lo consiglierei "" + 42perché in caso di aggiunta di stringhe di numeri interi si potrebbe finire per aggiungere i valori e non realizzarlo.
BoltzmannBrain,

20
Se non ti piace scrivere molto, probabilmente non dovresti programmare in Java.
Adam Pierce,

Risposte:


548

Integer.toStringchiama il metodo statico nella classe Integer. Non ha bisogno di un'istanza di Integer.

Se chiami new Integer(i), crei un'istanza di tipo Integer, che è un oggetto Java completo che incapsula il valore del tuo int. Quindi si chiama il toStringmetodo su di esso per chiedergli di restituire una rappresentazione di stringa di se stesso .

Se tutto ciò che vuoi è stampare un int, dovresti usare il primo perché è più leggero, più veloce e non usa memoria aggiuntiva (a parte la stringa restituita).

Se vuoi un oggetto che rappresenta un valore intero, per esempio per inserirlo in una raccolta, dovresti usare il secondo, poiché ti dà un oggetto completo per fare tutto ciò che non puoi fare con un nudo int.


96

new Integer(i).toString()crea innanzitutto un oggetto wrapper (ridondante) attorno i(che a sua volta può essere un oggetto wrapper Integer).

Integer.toString(i) è preferito perché non crea oggetti inutili.


43

Un'altra opzione è il String.valueOfmetodo statico .

String.valueOf(i)

Si sente un po 'più a destra che Integer.toString(i)a me. Quando il tipo di i cambia, ad esempio da inta double, il codice rimarrà corretto.


2
Sì. A meno che non sia necessario utilizzare RADIX (in tal caso è necessario utilizzare Integer.toString)
marcolopes

14
  1. new Integer(i).toString();

    Questa istruzione crea l'oggetto dell'Integer e quindi chiama i suoi metodi toString(i)per restituire la rappresentazione String del valore Integer .

  2. Integer.toString(i);

    Esso restituisce l'oggetto stringa che rappresenta l'int specifico (numero intero) , ma qui toString(int)è un staticmetodo.

Il sommario è nel primo caso restituisce la rappresentazione di stringa degli oggetti, mentre come nel secondo caso restituisce la rappresentazione di stringa dell'intero.


13

Consiglio vivamente anche l'uso

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

Semplice ed efficace


38
questa è decisamente una cattiva forma, perché entrambe si basano su una parte abbastanza sottile del linguaggio Java ed è meno efficiente di Integer.toString (i). Vedi questo post SO
rickcnagy,

Questo potrebbe essere inefficiente. Suggerisco di usare alcune scelte convenzionali come Integer.toString o String.valueOf. Controlla qui javadevnotes.com/java-integer-to-string-examples
JavaDev

In genere è una cattiva idea fare le cose in modo così poco intuitivo. Scelte più ovvie come Integer.toString()potrebbero usare alcuni tasti aggiuntivi, ma sono molto più chiare, il che è cruciale quando si desidera mantenere il codice.
Calvin Li

Questo non chiamerebbe automaticamente il toString()metodo della variabile intera ?
Ankit Deshpande,

11

Anche se mi piace la raccomandazione di Fhucho di

String.valueOf(i)

L'ironia è che questo metodo chiama effettivamente

Integer.toString(i)

Quindi, usa String.valueOf(i)se ti piace come legge e non hai bisogno di radix, ma anche sapendo che è meno efficiente di Integer.toString(i).


4

In termini di misurazione delle prestazioni, se si considera la prestazione temporale quindi Integer.toString (i); è costoso se chiami meno di 100 milioni di volte. Altrimenti se sono più di 100 milioni di chiamate, allora il nuovo Integer (10) .toString () funzionerà meglio.

Di seguito è riportato il codice attraverso cui puoi provare a misurare le prestazioni,

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 termini di memoria, il

new Integer (i) .toString ();

occuperà più memoria poiché creerà l'oggetto ogni volta, quindi accadrà la frammentazione della memoria.


2
Ho incollato questo codice in IntelliJ IDEA e ho ricevuto un avviso: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt

Questo codice funziona per me. Ricevo circa 420 millisecondi per Integer.toString (10) e 525 millisecondi per il nuovo Integer (10) .toString ()
Jake Stevens-Haas,


Avrebbe aiutato a riscaldare prima, altrimenti i risultati non sono validi!
Sixones,

Se dici che uno è costoso in un caso e l'altro è migliore nell'altro caso, significa che l'altro è migliore / economico in ogni situazione.
Sgene9,

2

Meglio:

Integer.valueOf(i).toString()

9
Perché è meglio?
Emile,

1
Penso che sia meglio, perché come ha sottolineato @Dhiraj in termini di memoria, il "nuovo numero intero (i) .toString ();" occuperà più memoria perché crea un nuovo oggetto invece di ottenere semplicemente il valore Integer e convertirlo in una stringa.
Patricia,

4
@Lucy Integer.valueOf (i) restituisce un nuovo numero intero, quindi non c'è differenza
inigoD

Non stai fornendo una risposta alla domanda. La domanda è qual è la differenza tra blah e blah, non qual è un sostituto migliore per blah.
ahitt6345,

2

Il modo semplice è semplicemente concatenato ""con intero:

int i = 100;

String s = "" + i;

ora savrà 100come valore stringa.


1

Qui Integer.toStringchiama il metodo statico nella classe Integer. Non richiede l'oggetto da chiamare.

Se ti chiami new Integer(i), crea prima un'istanza di tipo Intero, che è un oggetto Java completo che incapsula il valore di int i. Quindi si chiama il toStringmetodo su di esso per chiedergli di restituire una rappresentazione di stringa di se stesso.


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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.