我试图找出何时使用或为什么capacity()
方法与length()
或StringBuilder
类的StringBuffer
方法不同。
我搜索了Stack Overflow并设法提出this回答,但我不理解它与length()
方法的区别。我也访问了this网站,但这对我帮助更少。
答案 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()
方法将容量减小到实际大小。
我试图用最好的术语解释它,所以我希望它有用。