我有以下代码行:
return ROOT_USER_IMAGE_PATH + File.separator + userId
+ File.separator + nameWithoutExtension + "__"
+ new SimpleDateFormat("yyyyMMddhhmm").format(new Date())
+ extension;
在代码审查中,我的同事说我用StringBuilder
替换了它。
我知道它会更快地工作,但我认为这种增强绝对是次要的,没有人能感觉到它。
你认为在我们记忆力很强的现代情况下,像这样和未成年人一起鲤鱼有什么意义?
什么都不做。编译器将在后台为您使用StringBuilder
。
您的版本已经更短,更具可读性。不需要用StringBuilder
替换,尤其是编译器很可能会优化它以使用StringBuilder
。
如果还检查生成的字节码,则对案例中的每个字符串使用 StringBuilder
和 append
可能会导致比简单串联更多的字节码。
使用字符串串联的示例字节码:
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
更有效,或者当字符串预计通过插入或替换字符而更改时。