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

428

Às vezes java me intriga.
Eu tenho uma quantidade enorme de inicializações int a serem feitas.

Qual a diferença real ?

  1. Integer.toString(i)
  2. new Integer(i).toString()
marcolopes
fonte
20
Eu usaria apenas "" + 42, mas ei, sou eu. O formulário 2 resultará em um novo objeto inteiro (para a maioria dos valores de i) como intermediário. Também é mais digitação.
16
@ pst: se o objeto intermediário é um problema para você, então "" + 42não é melhor, pois exige um intermediário StringBuilderque é muito mais pesado que um Integer.
Joachim Sauer
47
"" + 42 pode funcionar, mas é uma má ideia. Pessoas como eu vão olhar o seu código e tentar descobrir o que diabos aconteceu com a string vazia.
Mainguy
3
Eu não recomendaria "" + 42porque, no caso de anexar seqüências de números inteiros, você pode acabar adicionando os valores e não percebendo.
BoltzmannBrain
20
Se você não gosta muito de digitar, provavelmente não deve programar em Java.
Adam Pierce

Respostas:

548

Integer.toStringchama o método estático na classe Integer. Não precisa de uma instância de Integer.

Se você ligar, new Integer(i)criará uma instância do tipo Integer, que é um objeto Java completo que encapsula o valor do seu int. Em seguida, você chamar o toStringmétodo nele para pedir-lhe para voltar a representação de si .

Se tudo o que você deseja é imprimir um int, você usaria o primeiro porque é mais leve, mais rápido e não usa memória extra (além da string retornada).

Se você deseja que um objeto represente um valor inteiro - para colocá-lo dentro de uma coleção, por exemplo -, use o segundo, pois ele fornece um objeto completo para fazer todo o tipo de coisas que você não pode fazer com nada int.

Jean
fonte
96

new Integer(i).toString()primeiro cria um objeto de wrapper (redundante) ao redor i(que por si só pode ser um objeto de wrapper Integer).

Integer.toString(i) é preferido porque não cria objetos desnecessários.

oksayt
fonte
43

Outra opção é o String.valueOfmétodo estático .

String.valueOf(i)

Ele sente um pouco mais direito do que Integer.toString(i)para mim. Quando o tipo de i for alterado, por exemplo, de intpara double, o código permanecerá correto.

fhucho
fonte
2
Sim. A menos que você deve usar RADIX (nesse caso, você deve usar Integer.toString)
marcolopes
14
  1. new Integer(i).toString();

    Esta instrução cria o objeto do Inteiro e, em seguida, chama seus métodos toString(i)para retornar a representação em String do valor do Inteiro .

  2. Integer.toString(i);

    Ele retorna o objeto String que representa o int específico (inteiro) , mas aqui toString(int)está um staticmétodo.

Resumo é, no primeiro caso, retorna a representação de sequência de objetos, enquanto que no segundo caso, retorna a representação de sequência de números inteiros.

Dhiraj
fonte
13

Eu também recomendo usar

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

Simples e eficaz.

Jasper Holton
fonte
38
esta é definitivamente uma forma ruim, porque ela se baseia em uma parte bastante sutil da linguagem Java e é menos eficiente que Integer.toString (i). Veja este post SO
rickcnagy
Isso pode ser ineficiente. Sugiro usar algumas opções convencionais como Integer.toString ou String.valueOf. Verifique aqui javadevnotes.com/java-integer-to-string-examples
JavaDev 15/02/15
Geralmente, é uma má idéia fazer as coisas de maneira tão pouco intuitiva. Escolhas mais óbvias Integer.toString()podem usar algumas teclas extras, mas são muito mais claras, o que é crucial quando você deseja manter o código.
Calvin Li
Isso não chamaria automaticamente o toString()método da variável inteira ?
Ankit Deshpande
11

Embora eu goste da recomendação de fhucho de

String.valueOf(i)

A ironia é que esse método realmente chama

Integer.toString(i)

Portanto, use String.valueOf(i)se você gosta de ler e não precisa de radix, mas também sabendo que é menos eficiente que Integer.toString(i).

Nathan Waite
fonte
4

Em termos de medição de desempenho, se você está considerando o desempenho do tempo, então Integer.toString (i); é caro se você estiver ligando menos de 100 milhões de vezes. Caso contrário, se houver mais de 100 milhões de chamadas, o novo Integer (10) .toString () terá um desempenho melhor.

Abaixo está o código através de você pode tentar medir o desempenho,

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));
    }

Em termos de memória, o

novo inteiro (i) .toString ();

precisará de mais memória, pois criará o objeto toda vez; portanto, ocorrerá a fragmentação da memória.

Dhiraj
fonte
2
Eu colei esse código no IntelliJ IDEA e recebi um aviso: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt 15/10/10
Este código funciona para mim. Eu recebo cerca de 420 milissegundos para Integer.toString (10) e 525 milissegundos para new Integer (10) .ToString ()
Jake Stevens-Haas
Teria ajudado a aquecer primeiro, caso contrário, os resultados não são válidos!
sixones 21/09/16
Se você diz que um é caro em um caso e o outro é melhor no outro, isso significa que o outro é melhor / barato em todas as situações.
precisa saber é o seguinte
2

Melhor:

Integer.valueOf(i).toString()
Ryu
fonte
9
Por que isso é melhor?
Emile
1
Eu acho que isso é melhor, porque como @Dhiraj apontou que, em termos de memória, o "novo número inteiro (i) .toString ();" consumirá mais memória porque cria um novo objeto em vez de apenas obter o valor Inteiro e convertê-lo em uma string.
Patricia
4
@Lucy Integer.valueOf (i) retorna um novo Integer, por isso não há diferença
inigoD
Você não está fornecendo uma resposta para a pergunta. A questão é qual é a diferença entre blá e blá, não qual é o melhor substituto para blá.
ahitt6345
2

Maneira simples é apenas concatenar ""com número inteiro:

int i = 100;

String s = "" + i;

agora sterá 100como valor de sequência.

Shiv Buyya
fonte
1

Aqui Integer.toStringchama o método estático na classe Inteiro. Não requer que o objeto chame.

Se você ligar new Integer(i)primeiro, crie uma instância do tipo Inteiro, que é um objeto Java completo que encapsula o valor do seu int i. Em seguida, chame o toStringmétodo para solicitar que ele retorne uma representação de string em si.

Shailej Shimpi
fonte
0

1Integer.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 Nandam Sirmarigari
fonte