如果我有足够的内存,我应该使用 stringBuilder 重写字符串 concat 吗?



我有以下代码行:

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

在代码审查中,我的同事说我用StringBuilder替换了它。

我知道它会更快地工作,但我认为这种增强绝对是次要的,没有人能感觉到它。

你认为在我们记忆力很强的现代情况下,像这样和未成年人一起鲤鱼有什么意义?

什么都不做。编译器将在后台为您使用StringBuilder

您的版本已经更短,更具可读性。不需要用StringBuilder替换,尤其是编译器很可能会优化它以使用StringBuilder

如果还检查生成的字节码,则对案例中的每个字符串使用 StringBuilderappend 可能会导致比简单串联更多的字节码。

使用字符串串联的示例字节码:

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更有效,或者当字符串预计通过插入或替换字符而更改时。

最新更新