Должен ли я переписать string concat с помощью stringBuilder, если у меня достаточно памяти?


У меня есть следующая строка кода:

return ROOT_USER_IMAGE_PATH + File.separator + userId 
       + File.separator + nameWithoutExtension + "__" 
       + new SimpleDateFormat("yyyyMMddhhmm").format(new Date()) 
       + extension;

На code review мой коллега сказал, что Я заменил его с помощью StringBuilder.

Я знаю, что это будет работать быстрее, но я думаю, что это улучшение будет абсолютно незначительным, и никто не сможет его почувствовать. Как вы думаете, есть ли смысл придираться к таким несовершеннолетним в современной ситуации, когда у нас много памяти?
2 2

2 ответа:

Ничего не делай. Компилятор будет использовать StringBuilder для вас за кулисами.

Ваша версия уже короче и более читабельна. Замена на StringBuilder не требуется, тем более что компилятор, скорее всего, оптимизирует его для использования StringBuilder.

Если вы также проверяете сгенерированный байт-код, использование StringBuilder и append ing для каждой строки в вашем случае может привести к большему байт-коду, чем простая конкатенация.

Пример байт-кода с использованием конкатенации строк:

aload_1
invokestatic java/lang/String/valueOf(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java/lang/StringBuilder/<init>(Ljava/lang/String;)V
getstatic java/io/File/separator Ljava/lang/String;
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload_2
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
areturn

Использование StringBuilder:

invokespecial java/lang/StringBuilder/<init>()V
astore_3
aload_3
aload_1
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
pop
aload_3
getstatic java/io/File/separator Ljava/lang/String;
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
pop
aload_3
aload_2
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
pop
aload_3
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
areturn

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