StringBuilder 中 length() 和 capacity() 方法的区别
Difference between length() and capacity() methods in StringBuilder
我试图找出何时使用或为什么 capacity()
方法不同于 StringBuilder
或 StringBuffer
类 的 length()
方法。
我在 Stack Overflow 上进行了搜索,并设法找到了 this answer, but I didn't understand its distinction with length()
method. I have visited this 网站,但这对我的帮助更小。
StringBuilder
用于构建文本。在内部,它使用一个字符数组来保存您添加到其中的文本。 capacity
是数组的大小。 length
是当前应该使用的文本填充了该数组的多少。因此:
StringBuilder sb = new StringBuilder(1000);
sb.append("testing");
capacity()
为1000(内部数组有1000个字符的空间需要换成更大的),length()
为7(数组中有7个有意义的字符) .
容量很重要,因为如果您尝试向 StringBuilder
添加超过其容量的文本,它必须分配一个新的、更大的缓冲区并将内容复制到其中,这会占用内存和性能影响*。例如,StringBuilder
的默认容量当前为 16 个字符(没有记录并且可能会更改),因此:
StringBuilder sb = new StringBuilder();
sb.append("Singing:");
sb.append("I am the very model of a modern Major General");
...创建一个带有 char[16]
的 StringBuilder
,将 "Singing:"
复制到该数组中,然后必须创建一个 new数组并将内容复制到其中,然后才能添加第二个字符串,因为它没有足够的空间来添加第二个字符串。
* (是否重要取决于代码在做什么)
字符串的长度始终小于或等于生成器的容量。长度为构建器中存储的字符串的实际大小,容量为当前可以容纳的最大大小
如果添加更多字符超过其容量,构建器的容量会自动增加。在内部,字符串生成器是一个字符数组,因此生成器的容量就是数组的大小。如果超过构建器的容量,则该数组将被新数组替换。新数组大小为 2 * (the previous array size + 1)
.
由于您是 Java 的新手,我会向您推荐关于 StringBuilder 效率的提示:
您可以使用newStringBuilder(initialCapacity)
创建一个具有指定初始容量的StringBuilder。通过仔细选择初始容量,您可以使您的程序更有效率。如果容量总是大于构建器的实际长度,JVM 将永远不需要为构建器重新分配内存。另一方面,如果容量太大,你会浪费内存space。您可以使用trimToSize()
方法将容量减少到实际大小。
我已尽我所能对其进行解释,希望对您有所帮助。
我试图找出何时使用或为什么 capacity()
方法不同于 StringBuilder
或 StringBuffer
类 的 length()
方法。
我在 Stack Overflow 上进行了搜索,并设法找到了 this answer, but I didn't understand its distinction with length()
method. I have visited this 网站,但这对我的帮助更小。
StringBuilder
用于构建文本。在内部,它使用一个字符数组来保存您添加到其中的文本。 capacity
是数组的大小。 length
是当前应该使用的文本填充了该数组的多少。因此:
StringBuilder sb = new StringBuilder(1000);
sb.append("testing");
capacity()
为1000(内部数组有1000个字符的空间需要换成更大的),length()
为7(数组中有7个有意义的字符) .
容量很重要,因为如果您尝试向 StringBuilder
添加超过其容量的文本,它必须分配一个新的、更大的缓冲区并将内容复制到其中,这会占用内存和性能影响*。例如,StringBuilder
的默认容量当前为 16 个字符(没有记录并且可能会更改),因此:
StringBuilder sb = new StringBuilder();
sb.append("Singing:");
sb.append("I am the very model of a modern Major General");
...创建一个带有 char[16]
的 StringBuilder
,将 "Singing:"
复制到该数组中,然后必须创建一个 new数组并将内容复制到其中,然后才能添加第二个字符串,因为它没有足够的空间来添加第二个字符串。
* (是否重要取决于代码在做什么)
字符串的长度始终小于或等于生成器的容量。长度为构建器中存储的字符串的实际大小,容量为当前可以容纳的最大大小
如果添加更多字符超过其容量,构建器的容量会自动增加。在内部,字符串生成器是一个字符数组,因此生成器的容量就是数组的大小。如果超过构建器的容量,则该数组将被新数组替换。新数组大小为 2 * (the previous array size + 1)
.
由于您是 Java 的新手,我会向您推荐关于 StringBuilder 效率的提示:
您可以使用newStringBuilder(initialCapacity)
创建一个具有指定初始容量的StringBuilder。通过仔细选择初始容量,您可以使您的程序更有效率。如果容量总是大于构建器的实际长度,JVM 将永远不需要为构建器重新分配内存。另一方面,如果容量太大,你会浪费内存space。您可以使用trimToSize()
方法将容量减少到实际大小。
我已尽我所能对其进行解释,希望对您有所帮助。