Должен ли я переписать 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 ответа:
Ваша версия уже короче и более читабельна. Замена на
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
в цикле, где строится некоторая строка, или когда ожидается, что строка изменится путем вставки или замены символов.