Java StringBuffer的容量是多少?它的目的和效果是什么?

Java StringBuffer的容量是多少?它的目的和效果是什么?,java,stringbuffer,capacity,Java,Stringbuffer,Capacity,StringBuffer的容量是多少? 程序启动时是否需要设置容量大小?如果未设置,是否会导致程序运行缓慢? 例如,使用长度超过1000个字符的StringBuffer outputSource=new StringBuffer() 另一方面,设置一个相对准确的值会提高程序的计算性能吗? 我希望我的问题是清楚的。 谢谢你 任何stringbuffer都是可变的。一旦它被分配到内存,它就不会再创建任何对象 因此,如果您相对地定义了StringBuffer的任何大小,那么它对性能没有影响。您应该使用

StringBuffer的容量是多少? 程序启动时是否需要设置容量大小?如果未设置,是否会导致程序运行缓慢? 例如,使用长度超过1000个字符的
StringBuffer outputSource=new StringBuffer()
另一方面,设置一个相对准确的值会提高程序的计算性能吗?
我希望我的问题是清楚的。

谢谢你

任何stringbuffer都是可变的。一旦它被分配到内存,它就不会再创建任何对象


因此,如果您相对地定义了StringBuffer的任何大小,那么它对性能没有影响。您应该使用较新的
StringBuilder
类。本质上是一样的,但没有同步

如果您事先知道大致的大小,那么为
StringBuilder
分配足够的容量会更有效。这样,在操作过程中不需要调整自身大小

请注意,除非您使用多个操作来创建长字符串,否则它不会真正影响性能。例如,定义容量可能有用的情况是创建一个10000个字符的字符串,每次追加10个字符。它需要1000个追加调用,并且可能需要多次调整内部
char[]
的大小

但是,如果要创建一个包含10000个字符和2个附录的字符串,则可能只会得到2个大小调整。这不太可能是性能方面的问题。

每个字符串缓冲区都有一个容量。只要长度 字符串缓冲区中包含的字符序列不超过 容量,则无需分配新的内部缓冲区阵列。 如果内部缓冲区溢出,它会自动变大。像 在JDK5发行版中,这个类已经补充了一个等价的类 类设计用于单个线程StringBuilder。这个 通常应优先使用StringBuilder类 第一,因为它支持所有相同的操作,但是它更快,因为 不执行同步

一些重要的收获

如果缓冲区的容量溢出,则需要分配更多内存,这将对性能产生一定影响,具体取决于
StringBuffer
的使用方式

基本上,
StringBuffer
的容量与分配给程序的内存相同


如果不是多线程,则使用
StringBuilder
StringBuffer
是线程安全的。因此,当它有大量的if数据时,运行速度会变慢。使用
StringBuilder
代替单线程应用程序。与
StringBuffer
相比,它的访问速度更快。但是
StringBuilder
不是线程安全的

因为字符串是不可变的(不能更改),连接可能会非常耗时和占用内存,因为每次连接时,旧版本加上需要追加的字符串都被创建为新变量,而旧变量仍在堆上

StringBuilder包含一个内部缓冲区,因此只需要复制要追加的字符串

如果StringBuilder空间不足,它会将其缓冲区加倍(在这种情况下,需要复制整个字符串)。为什么缓冲区会加倍,而不仅仅是扩展到与旧字符串的大小+附加字符串的大小相匹配的大小,原因是在这种情况下,必须再次复制字符串。因此它加倍了

也可以在StringBuilder的构造函数中提供最终的缓冲区大小,只有在您已经知道StringBuilder中会有多少缓冲区时才有意义


希望这有帮助

您应该更喜欢使用
StringBuffer

StringBuffer类是一个可变类,而String类是不可变的。StringBuffer类的容量和字符串。StringBuffer可以动态更改。当涉及大量修改字符串(追加、插入、删除、修改等)时,首选字符串缓冲区

StringBuffere类中有类似于
capacity()
ensureCapacity()
的函数

capacity():返回字符串缓冲区的当前容量。

ensureCapacity():此方法确保字符串缓冲区的最小容量。

您可以通过以下链接了解StringBuffer的简介: