StringBuffer 的容量是多少?程序启动时是否需要设置容量大小?如果不设置,是否会导致程序运行缓慢?例如。超过 1000 个长度StringBuffer outputSource = new StringBuffer();
的字符使用 另一方面,设置一个相对准确的值应该会增加程序的计算性能吗?我希望我的问题很清楚。感谢先进!
6 回答
您应该使用更新的StringBuilder
课程。它本质上是相同的,但没有同步。
如果您事先知道大概的大小,那么分配StringBuilder
足够的容量会更有效。这样它就不需要在操作期间调整自身大小。
请注意,除非您使用多个操作来创建长字符串,否则它不会真正影响性能。定义容量可能有用的情况是,例如创建一个包含 10,000 个字符的字符串,一次附加 10 个字符。这将需要 1000 次追加调用,并且可能需要char[]
多次调整内部大小。
但是,如果您要创建一个包含 10,000 个字符并带有 2 个附加的字符串,则可能只会得到 2 次调整大小。这不太可能是性能方面的问题。
每个字符串缓冲区都有一个容量。只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。从 JDK 5 开始,该类已经补充了一个为单线程使用而设计的等效类 StringBuilder。通常应优先使用 StringBuilder 类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。
一些重要的外卖
如果溢出缓冲区的容量需要分配更多内存,这将对性能产生一些影响,具体取决于StringBuffer
使用方式。
基本上,内存的容量与StringBuffer
您分配给程序的内存一样多。
如果你不是多线程使用StringBuilder
StringBuffer
是线程安全的。因此,如果数据量很大,它的运行速度会变慢。而不是您的应用程序是单线程使用StringBuilder
。与 相比,它是快速访问StringBuffer
。但StringBuilder
不是线程安全的。
由于字符串是不可变的(不能更改),连接可能会非常耗时和消耗内存,因为每次连接时,旧版本加上需要附加的字符串都被创建为新变量,而旧变量仍在堆上...
StringBuilder 拥有一个内部缓冲区,因此只需要复制您想要附加的字符串。
如果 StringBuilder 空间不足,它会将缓冲区加倍(在这种情况下,需要复制整个字符串)。缓冲区加倍而不只是扩展到与旧字符串大小+附加的大小相匹配的大小的原因是,在这种情况下,字符串总是必须再次复制。因此它加倍。
也可以在 StringBuilder 的构造函数中提供最终的缓冲区大小,这只有在您已经知道有多少将进入您的 StringBuilder 时才有意义
希望这可以帮助
您应该更喜欢使用StringBuffer
类。
StringBuffer 类是一个可变类,与不可变的 String 类不同。StringBuffer 类的容量和字符串。StringBuffer 可以动态更改。当涉及大量字符串修改(追加、插入、删除、修改等)时,字符串缓冲区是首选。
在 StringBuffere 类中有类似capacity()
和的函数。ensureCapacity()
capacity() : Returns the current capacity of the String buffer.
ensureCapacity() : this method ensures minimum capacity of the String buffer.
您可以通过以下链接了解有关 StringBuffer 的简要信息:
任何 stringbuffer 是可变的。一旦它被分配到内存,它不会再创建任何对象。
因此,如果您相对定义任何大小的 strignbuffer,它不会影响性能