2016-10-31 4 views
7

Я только что прочитал об этой функции Java 9 https://bugs.openjdk.java.net/browse/JDK-8085796, в которой говорится, что конкатенация «slow» StringBuilder будет улучшена.Java 9 integer to String cast

Итак, мой вопрос в том, есть ли еще какие-то недостатки выполнения int для String:

int i = 16; 
String s = ""+i; 

Или есть какие плюсы/минусы литья междунар в строку, используя Integer.toString(i) или String.valueOf(i)?

Редактировать: Поскольку мой вопрос был слишком основан на мнениях (для этого нужен), я изменил его. Меня интересуют положительные или отрицательные стороны различных отливок. И каждый должен решить для себя, какой из них использовать.

+15

Короче, да. Легче понять? Я так не думаю. 'Integer.parseInt' - красная селедка, поскольку она идет в противоположном направлении - 'String.valueOf (i)' точно говорит *, что он делает. Ваша цель - не выполнять конкатенацию строк, поэтому почему ваш код включает конкатенацию строк? –

+1

Улучшение не означает, что это так же быстро. Лично я предпочитаю использовать '' "+ i' (если вы не знаете, что есть проблема с производительностью), но это вопрос вкуса. –

+1

« Легче понять »субъективно. – shmosel

ответ

5

Прежде всего, предположение, что 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 легко вписывается в емкость по умолчанию 16char s.

Для большинства нетривиальных int значений, затраты на преобразование в десятичной форме перевешивает другие расходы значительно, так что если вы предпочитаете ""+i над Integer.toString(i) вы не должны позволять проблемы производительности быть причиной не использовать его. Это также означает, что вы не должны ожидать резкого ускорения с реализацией Java 9. Основная операция остается прежней.

Я думаю, самое большое улучшение решения Java 9 является уменьшение размера кода, так как все эти сходные последовательности Призыва, генерируется для каждого выражения конкатенации строки, будет раз в одной команде (это особенно актуально для конкатенации нескольких выражений). Возможность повышения производительности, только хорошее дополнение, но я бы не стало ожидать улучшений быть драматичными, особенно не в первых версиях JRE 9.

Так что решение между ""+i и Integer.toString(i) или String.valueOf(i) это просто стилистический вопрос (который мы здесь не обсуждаем), а не проблема производительности.

+0

Точность постоянной времени компиляции является интересной. Большое спасибо за этот подробный ответ. –