Java StringBuilder带来了巨大的开销

Java StringBuilder带来了巨大的开销,java,Java,我在某个地方读到,JavaStringBuilder使用大约1MB来存储500个字符。这是真的吗?如果是的话,这不是有点极端吗?StringBuilder是否在用这么大的内存做一些不可思议的事情?原因是什么?这是否意味着我不应该过多地使用这个类?不,这完全是胡说八道——当然,除非你创建了一个容量巨大的StringBuilder Java通常每个字符使用2个字节。字符串和StringBuilder在长度和数组本身方面有一点开销,但不是很多 现在,500个字符的1K大约是正确的。。。我怀疑这是引起混

我在某个地方读到,JavaStringBuilder使用大约1MB来存储500个字符。这是真的吗?如果是的话,这不是有点极端吗?StringBuilder是否在用这么大的内存做一些不可思议的事情?原因是什么?这是否意味着我不应该过多地使用这个类?

不,这完全是胡说八道——当然,除非你创建了一个容量巨大的StringBuilder

Java通常每个字符使用2个字节。字符串和StringBuilder在长度和数组本身方面有一点开销,但不是很多


现在,500个字符的1K大约是正确的。。。我怀疑这是引起混乱的原因。(不是你听错了,就是和你说话的人在重复他们听错的东西。)

这个信息是错误的,你还记得这个信息的来源吗?如果是这样,你应该纠正它。Java通常每个字符使用2个字节。

因为对500个字符加倍重新分配2K也是正确的,但不会更多。下面是一个例子。

我看到了两种StringBuilder倾向于使用大量内存的情况:

  • 当StringBuilder以疯狂的初始容量创建时
  • “缓存”以“保存”对象分配时间的StringBuilder
因此,在第二种情况下,如果先前使用SB的某些代码在其中存储了非常大的字符串,StringBuilder可能会消耗1Mb内存。这是因为它只会增长而不会收缩其内部字符数组


这两种情况都可以(也应该)很容易避免。

我认为StringBuilder是最好的选择。它也更快更安全。这取决于具体情况。如果您有不经常更改的字符串文字,那么我会说字符串是更好的选择,因为它是不可变的,否则StringBuilder就在那里。现在,对于您正在谈论的空间,我在哪里都没有听说过。

您在哪里读到这篇文章的?当然是在互联网上的某个地方。比什么更快?更安全的?请注意,与StringBuffer不同,StringBuilder不是线程安全的。顺便说一句,这个问题已经问了将近8年了…比StringBuffer快。任何你需要理解的东西。