Прежде всего, предположение, что Integer.toString(i)
всегда быстрее, чем ""+i
не выполняется.
В частности, если i
- это постоянная времени компиляции, ""+i
будет также, вопреки String.valueOf(i)
. Конечно, если определение похоже на final int i=16;
, читатели будут возражать против использования ""+i
, так как "16"
будет намного понятнее. Но если мы говорим о final int DEFAULT_USER = DEFAULT_GROUP << GROUP_BIT;
, то ""+DEFAULT_USER
намного яснее, чем буквальная строка, содержащая фактическое число. И быть константой времени компиляции - это больше, чем просто проблема с производительностью, она позволяет использовать строку в аннотациях или case
ярлыков оператора switch
.
Если i
не является константой времени компиляции, нет обязательной скомпилированной формы, поэтому в принципе компиляторы могут компилировать ""+i
в Integer.toString(i)
в любом случае. Если мы сравним обычную наивную (или назовем ее «прямолинейной») реализацию new StringBuilder().append("").append(i).toString()
с вариантом Integer.toString(i)
или гипотетической оптимизированной реализацией Java 9, только окончательное действие копирования из буфера StringBuilder
в результат массива значений String
может влиять на производительность, но это может быть оптимизировано JVM HotSpot. Другая проблема, на которую нацелено решение Java 9, - начальная емкость StringBuilder
, здесь не уместна, так как строковое представление int
легко вписывается в емкость по умолчанию 16
char
s.
Для большинства нетривиальных int
значений, затраты на преобразование в десятичной форме перевешивает другие расходы значительно, так что если вы предпочитаете ""+i
над Integer.toString(i)
вы не должны позволять проблемы производительности быть причиной не использовать его. Это также означает, что вы не должны ожидать резкого ускорения с реализацией Java 9. Основная операция остается прежней.
Я думаю, самое большое улучшение решения Java 9 является уменьшение размера кода, так как все эти сходные последовательности Призыва, генерируется для каждого выражения конкатенации строки, будет раз в одной команде (это особенно актуально для конкатенации нескольких выражений). Возможность повышения производительности, только хорошее дополнение, но я бы не стало ожидать улучшений быть драматичными, особенно не в первых версиях JRE 9.
Так что решение между ""+i
и Integer.toString(i)
или String.valueOf(i)
это просто стилистический вопрос (который мы здесь не обсуждаем), а не проблема производительности.
Короче, да. Легче понять? Я так не думаю. 'Integer.parseInt' - красная селедка, поскольку она идет в противоположном направлении - 'String.valueOf (i)' точно говорит *, что он делает. Ваша цель - не выполнять конкатенацию строк, поэтому почему ваш код включает конкатенацию строк? –
Улучшение не означает, что это так же быстро. Лично я предпочитаю использовать '' "+ i' (если вы не знаете, что есть проблема с производительностью), но это вопрос вкуса. –
« Легче понять »субъективно. – shmosel