StringBuilder

时间:2017-09-06 09:24:46

标签: java stringbuilder stringbuffer

我试图找出何时使用或为什么capacity()方法与length()StringBuilder类的StringBuffer方法不同。

我搜索了Stack Overflow并设法提出this回答,但我不理解它与length()方法的区别。我也访问了this网站,但这对我帮助更少。

2 个答案:

答案 0 :(得分:5)

namespace eval ::testname { variable name foo variable major 1 variable minor 0 proc curname {} { variable name variable major variable minor return $name-$major.$minor } } set ::testname::name testfunction ::tcltest::test [::testname::curname] {} -body { puts [::testname::curname] } -cleanup { incr ::testname::minor } ::tcltest::test [::testname::curname] {} -body { puts [::testname::curname] } -cleanup { incr ::testname::minor } 用于构建文本。在内部,它使用一个字符数组来保存您添加到其中的文本。 oo::object create testname oo::objdefine testname { variable name major minor method init {nam {maj 1} {min 0}} { set name $nam set major $maj set minor $min } method name val {set name $val} method major val {set minor 0 ; set major $val} method minor val {set minor $val} method bump {} {incr minor} method curname {} {return $name-$major.$minor} } testname init testfunction ::tcltest::test [testname curname] {} -body { puts [testname curname] } -cleanup { testname bump } ::tcltest::test [testname curname] {} -body { puts [testname curname] } -cleanup { testname bump } 是数组的大小。 StringBuilder是当前应该使用的文本填充了多少该数组。所以:

capacity

length为1000(在内部数组需要用较大的数组替换之前有1000个字符的空间),StringBuilder sb = new StringBuilder(1000); sb.append("testing"); 为7(数组中有7个有意义的字符)。< / p>

容量非常重要,因为如果您尝试向capacity()添加比其容量更多的文本,则必须分配一个新的更大的缓冲区并将内容复制到其中,具有内存使用和性能问题*。例如,length()的默认容量目前为16个字符(未记录且可能更改),因此:

StringBuilder

...使用StringBuilder创建StringBuilder sb = new StringBuilder(); sb.append("Singing:"); sb.append("I am the very model of a modern Major General"); ,将StringBuilder复制到该数组中,然后创建 new 数组并复制内容之前它可以添加第二个字符串,因为它没有足够的空间来添加第二个字符串。

* (无论事项取决于代码的作用)

答案 1 :(得分:3)

字符串的长度始终小于或等于构建器的容量。长度是构建器中存储的字符串的实际大小,容量是当前可以容纳的最大大小

如果添加更多字符以超出其容量,则构建器的容量会自动增加。在内部,字符串构建器是一个字符数组,因此构建器的容量是数组的大小。如果超出构建器的容量,则阵列将替换为新阵列。新数组大小为2 * (the previous array size + 1)

由于您不熟悉Java,我建议您提供有关StringBuilder效率的提示:

您可以使用newStringBuilder(initialCapacity)创建具有指定初始容量的StringBuilder。通过仔细选择初始容量,您可以提高程序的效率。如果容量始终大于构建器的实际长度,则JVM将永远不需要为构建器重新分配内存。另一方面,如果容量太大,则会浪费内存空间。您可以使用trimToSize()方法将容量减小到实际大小。

我试图用最好的术语解释它,所以我希望它有用。