【问题标题】:Should I rewrite string concat using stringBuilder if I have enough memory?如果我有足够的内存,我应该使用 stringBuilder 重写字符串 concat 吗?
【发布时间】:2014-12-02 19:58:00
【问题描述】:

我有以下代码行:

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

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

我知道它会运行得更快,但我认为这种增强绝对是微不足道的,没有人能感觉到。

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

【问题讨论】:

  • 如果您已经对其进行了测试并且可以正常工作,那么根据您的同事的建议进行更改有点浪费时间。但是,请记住,最好不要一开始就编写这种代码。不过,老实说,我会使用 String.format( ) 来写这个 - 比 StringBuilder 更清晰。

标签: java string stringbuilder stringbuffer


【解决方案1】:

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

【讨论】:

  • nameWithoutExtension 不是最终的
  • 这无关。编译器将自动在字节码中使用StringBuilder 来连接非文字Strings。
  • 对 java 6 来说是真的吗?
  • 是的。您可以在编译器生成的.class文件上使用javap -c,并检查StringBuilder在字节码中的使用情况。
【解决方案2】:

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

如果您还检查生成的字节码,则在您的案例中对每个字符串使用StringBuilderappending 可能会产生比简单连接更多的字节码。

使用字符串连接的示例字节码:

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 会更有效,或者当希望通过插入或替换字符来更改字符串时。

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2013-12-16
    相关资源
    最近更新 更多