Java:清除StringBuffer内容

nam*_*ked 4 java stringbuilder stringbuffer

所有,

我想知道使用setLength(0)清除StringBuffer内容是否有意义.即做得更好:

while (<some condition>)
{
    stringBufferVariable = new StringBuffer(128);
    stringBufferVariable.append(<something>)
                        .append(<more>)
                        ... ;
    Append stringBufferVariable.toString() to a file;
    stringBufferVariable.setLength(0);
}
Run Code Online (Sandbox Code Playgroud)

我的问题:
1>这还有比使用String对象追加内容更好的性能吗?

我不确定如何重新初始化StringBuffer变量会影响性能,从而影响问题.

请写下你的意见

[编辑]:删除了关于与StringBuilder进行比较的第二个问题,因为我已经理解了基于响应的其他内容.

Bra*_*ace 7

比连接字符串好吗?

如果你问是否

stringBufferVariable.append("something")
                    .append("more");
...
Run Code Online (Sandbox Code Playgroud)

通常会比连接更好+,然后是.这就是这些类存在的全部原因.与更新char数组中的值相比,对象创建很昂贵.

在大多数情况下,如果不是所有编译器现在都将字符串连接转换为使用StringBuilder的简单情况,例如str = "something" + "more" + "...";.我可以看到的唯一性能差异是编译器没有设置初始大小的优势.基准测试会告诉您差异是否足够重要.+尽管如此,使用会使代码更具可读性.

从我读过的内容来看,编译器显然无法优化循环中的连接

String str = "";
for (int i = 0; i < 10000; i++) {
    str = str + i + ",";
}
Run Code Online (Sandbox Code Playgroud)

所以在这些情况下你仍然希望显式使用StringBuilder.

StringBuilder与StringBuffer

StringBuilder虽然不是线程安全StringBuffer的,但它们在其他方面是相同的.在StringBuffer中执行的同步使它更慢,因此StringBuilder更快,除非您需要同步,否则应该使用它.

你应该用setLength吗?

您的示例当前编写的方式我不认为调用setLength会给您带来任何东西,因为您在每次循环中都创建了一个新的StringBuffer.你应该做的是

StringBuilder sb = new StringBuilder(128);
while (<some condition>) {
    sb.append(<something>)
      .append(<more>)
      ... ;
    // Append stringBufferVariable.toString() to a file;
    sb.setLength(0);
}
Run Code Online (Sandbox Code Playgroud)

这样可以避免不必要的对象创建,setLength只会int在这种情况下更新内部变量.