Каков наиболее эффективный способ преобразования int в строку?
скажем, у меня есть:
int someValue = 42;
теперь я хочу преобразовать это значение int в строку. Какой способ более эффективен?
// One
String stringValue = Integer.toString(someValue);
// Two
String stringValue = String.valueOf(someValue);
// Three
String stringValue = someValue + "";
мне просто любопытно, есть ли какая-то реальная разница или один лучше другого?
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 только минимален, и как мы все знают, что "преждевременная оптимизация-корень всех зол".