String vs StringBuffer。 IDEA的提示

时间:2014-11-24 12:08:51

标签: java performance intellij-idea stringbuffer

Intellij Idea提供更换以下内容:

StringBuffer sb = new StringBuffer();
sb.append("Name=").append(name).append(", name2=").append(name2).append(", list=").append(list);
return sb.toString();

要:

return "name=" + name + ", name2=" + name2 + ", list=" + list;

据我所知,它不太有效(可变/不可变)。 那么,还有什么更好的呢?

2 个答案:

答案 0 :(得分:7)

第二个编译与第一个字节代码相同的字节代码,除了它使用非同步StringBuilder而不是同步StringBuffer。所以它不仅更具可读性,而且速度更快。我会选择第二个。

在循环中连接时使用StringBuilder很有用,以避免创建许多临时String对象:

String result = "";
for (String element : array) {
    result += element;
}

应替换为

StringBuilder builder = new StringBuilder();
for (String element : array) {
    builder.append(element);
}
String result = builder.toString();

答案 1 :(得分:1)

JavaCompiler自动将连接的字符串更改为StringBuilders->你可以在.class - Files。中找到它们。

因此对于java编译器也是如此。

提示对您而言,因为IntelliJ假定程序员更容易阅读连接字符串。

实施例: 编辑器中的toString-Method:

XYZ.java:

public class XYZ {

    private String x;
    private int y;
    private Integer z;

    @Override
    public String toString() {
        return "XYZ [x=" + x + ", y=" + y + ", z=" + z + "]";
    }

}

生成的toString-Method的字节代码:

XYZ.class:

public toString()Ljava/lang/String;
   L0
    LINENUMBER 9 L0
    NEW java/lang/StringBuilder
    DUP
    LDC "XYZ [x="
    INVOKESPECIAL java/lang/StringBuilder.<init> (Ljava/lang/String;)V
    ALOAD 0
    GETFIELD at/gv/brz/jus3/as/dto/XYZ.x : Ljava/lang/String;
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC ", y="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 0
    GETFIELD at/gv/brz/jus3/as/dto/XYZ.y : I
    INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
    LDC ", z="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 0
    GETFIELD at/gv/brz/jus3/as/dto/XYZ.z : Ljava/lang/Integer;
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder;
    LDC "]"
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ARETURN
   L1
    LOCALVARIABLE this Lat/gv/brz/jus3/as/dto/XYZ; L0 L1 0
    MAXSTACK = 3
    MAXLOCALS = 1
}

如您所见,编译器自动生成StringBuilder。因此,如果使用capacity参数生成它,那么使用明确的StringBuilder只是必要的。