gpt4 book ai didi

Java : Clearing StringBuffer contents

转载 作者:搜寻专家 更新时间:2023-11-01 01:30:00 28 4
gpt4 key购买 nike

全部,

我想知道使用 setLength(0) 清除 StringBuffer 内容是否有意义。即,这样做更好吗:

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

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

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

请发表您的看法

[编辑]:删除了关于与 StringBuilder 进行比较的第二个问题,因为我知道根据响应没有更多需要研究的内容。

最佳答案

比连接字符串更好?

如果你问是否

stringBufferVariable.append("something")
.append("more");
...

将比与 + 连接执行得更好,然后是的,通常。这就是这些类存在的全部原因。与更新 char 数组中的值相比,创建对象的成本很高。

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

根据我的阅读,编译器显然无法优化在循环中完成的连接,例如

String str = "";
for (int i = 0; i < 10000; i++) {
str = str + i + ",";
}

所以在这些情况下,您仍然希望显式使用 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);
}

这避免了不必要的对象创建,并且 setLength 在这种情况下只会更新内部 int 变量。

关于Java : Clearing StringBuffer contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4061523/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com