Каков наиболее эффективный способ преобразования int в строку?


скажем, у меня есть:

int someValue = 42;

теперь я хочу преобразовать это значение int в строку. Какой способ более эффективен?

// One
String stringValue = Integer.toString(someValue);

// Two
String stringValue = String.valueOf(someValue);

// Three
String stringValue = someValue + "";

мне просто любопытно, есть ли какая-то реальная разница или один лучше другого?

6 57

6 ответов:

протестировал его для 10м заданий числа 10

One:
real    0m5.610s
user    0m5.098s
sys     0m0.220s

Two:
real    0m6.216s
user    0m5.700s
sys     0m0.213s

Three:
real    0m12.986s
user    0m11.767s
sys     0m0.489s

кажется, один выиграл

изменить: JVM является стандартным '/ usr / bin / java ' под Mac OS X 10.5

java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)

файлы:

код по запросу

public class One {
    public static void main(String[] args) {
        int someValue = 10;
        for (int i = 0; i < 10000000; i++) {
            String stringValue = Integer.toString(someValue);
        }
    }
}

случай 2 и 3 аналогично
запустите с помощью

javac *.java; time java One; time java Two; time java Three

, хотя согласно измерения коббала, #1, кажется, самый быстрый, я настоятельно рекомендую использовать String.valueOf(). Моя причина заключается в том, что этот вызов явно не содержит тип аргумента, поэтому, если позже вы решите изменить его с int на double, нет необходимости изменять этот вызов. Прирост скорости на #1 по сравнению с #2 минимален, и, как мы все знаем, "преждевременная оптимизация является корнем всего зла".

третий о решении не может быть и речи, так как оно неявно создает StringBuilder и добавляет компоненты (в данном случае число и пустую строку) к этому и, наконец, преобразует это в строку.

первые два примера фактически идентичны, так как строка.valueOf (int) использует целое число.метод toString(int) метод. Третий уродлив и, вероятно, менее эффективен, поскольку конкатенация медленная в Java.

посмотреть исходный код JRE и вы, вероятно, увидите разницу. Или нет. На самом деле Стринв.valueOf (int foo) реализуется следующим образом:

public static String valueOf(int i) {
    return Integer.toString(i, 10);
}

и целое число.toString (int foo, int radix)

public static String toString(int i, int radix) {
   ...
   if (radix == 10) {
   return toString(i);
   }
   ...
}

это означает, что если вы используете основание 10, вам лучше позвонить в целое.toString (int foo) напрямую. В остальных случаях используйте целое число.toString (int foo, int radix).

решение concat сначала преобразует значение int в a Строка и позже связывается с пустой строкой. Это, очевидно, самый дорогой случай.

(напротив Дэвида Ханака.)

несмотря на то, что согласно измерениям cobbal, #1 кажется самым быстрым, я настоятельно рекомендую использовать Integer.toString (). Моя причина заключается в том, что этот вызов явно содержит тип аргумента, поэтому, если позже вы решите изменить его с int на double, ясно, что этот вызов изменился. Вы бы сделали то же самое, если бы это был двоичный формат, не так ли? Прирост скорости на #1 по сравнению с #2 только минимален, и как мы все знают, что "преждевременная оптимизация-корень всех зол".

"" + int медленнее, как показано выше Дэвида Ханаке.

String.valueOf() всвою очередь называет Integer.toString(). Следовательно, используя Integer.toString() лучше.

и Integer.toString() самый быстрый..