Создание строки в цикле и оптимизация кода

217
23 марта 2017, 19:30

Как будет правильнее (и займёт меньше времени при выполнении), если на каждой итерации цикла создаётся новая строка?

1 вариант - создание объекта строки в цикле:

while (conn.hasNext()) {
    String timerStr = StringUtils.isBlank(conn.getString("time_field")) ? "time" : conn.getString("time_field"));
    report.setTimer(new TimerSystem(id, timerStr));
}

2 вариант - вынос создания строки за цикл:

String timerStr;
while (conn.hasNext()) {
    timerStr = StringUtils.isBlank(conn.getString("time_field")) ? "time" : conn.getString("time_field"));
    report.setTimer(new TimerSystem(id, timerStr));
} 

3 вариант - без объявления переменной String:

while (conn.hasNext()) {
    report.setTimer(new TimerSystem(id, StringUtils.isBlank(conn.getString("time_field")) ? "time" : conn.getString("time_field"))));
} 

Или же все эти варианты абсолютно равнозначны?

P.S. На сайте уже был похожий вопрос Как будет быстрее? java, но мне всё-таки кажется, что здесь работа со строками и примитивными типами может отличаться.

Answer 1

На мой взгляд, оптимизировать в приведенных вариантах нечего. Переменная timerStr - это всего лишь указатель на строку. Cтрого говоря, сама аллокация памяти и создание новой строки у вас совершенно в другом месте, это зависит от реализации функции conn.getString(). Внутри цикла вы работаете только с указателями на строки.

Я бы записал в более удобочитаемом виде и не беспокоился о производительности до того момента пока вы не поймете, что именно это место является узким и требует оптимизаций:

while (conn.hasNext()) {
    String timeField = conn.getString("time_field");
    String timerStr = StringUtils.isBlank(timeField) ? "time" : timeField;
    report.setTimer(new TimerSystem(id, timerStr));
}

Дополнительно можно прочитать про string interning.

READ ALSO
Удаление элементов из ArrayList<Object> в Android

Удаление элементов из ArrayList<Object> в Android

В Android-приложении у меня реализован функционал по динамическому добавлению textView в linearLayout, и увеличению высоты этого Layout:

254
Android: отслеживание изменения даты

Android: отслеживание изменения даты

Ситуация следующая: есть TextView, текст отличается в зависимости от того, какая дата в системеЯ пытаюсь сделать так, чтобы это изменение происходило...

179
Как удалить значение из поля с помощью Java Reflection

Как удалить значение из поля с помощью Java Reflection

При попыткt установить в поле значение null я получаю ошибку

197
IDEA mysql-connector-java

IDEA mysql-connector-java

Следующий вопрос почему когда в pomxml описана зависимость mysql mysql-connector-java 5

184