12 de dez. de 2012

Conversão de números em strings

Emergiu uma pequena dúvida, se é mais adequado converter números para string usando o "gambi mode":
int i = 4;
String s = i + "";
Ou usando a API do Java:
int i = 4;
String s = String.valueOf(i);
Bem, em outros tópicos já falei sobre o funcionamento de Strings no Java, e inclusive no meu blog, que anda desatualizado, publiquei um post sobre Strings: http://marciojrtorres.blogspot.com.br/2010/06/strings-no-java.html

A questão é que o primeiro modo resulta na criação de uma nova String resultando da operador + sobrecarregado, e a segundo a partir da estrutura interna de Strings e Integer para criar uma String a partir de um array de char, onde muitos são constantes de Integer, podem verificar o código-fonte.

Na prática, o segundo modo é mais rápido, podem usar o código a seguir para testes:
public static void main(String[] args) {
    converteInteiroStringGambi();
    converteInteiroStringJava();
}

private static void converteInteiroStringGambi() {
    long inicio = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String s = i + "";
    }
    System.out.println("Tempo decorrido: " + (System.currentTimeMillis() - inicio) + "ms");
}

private static void converteInteiroStringJava() {
    long inicio = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String s = String.valueOf(i);
    }
    System.out.println("Tempo decorrido: " + (System.currentTimeMillis() - inicio) + "ms");
}
Atenção, não estou fazendo apologia ao segundo modo, usando String.valueOf, na verdade, podem seguir usando o primeiro, mas com a consciência de que é mais lento. A diferença é ínfima em uma ou duas operações esporádicas, mas evidente quando é usando dentro de iterações, como no exemplo. Enfim, sabendo as regras, é só saber quando segui-las e quando quebrá-las, é uma prerrogativa de programar deliberadamente e não por coincidência.