StringBuilder旨在减少与创建字符串相关的开销。
正如你可能会或可能不知道,字符串是不可变的。这意味着什么像
String a = "foo";
String b = "bar";
String c = a + b;
String d = c + c;
为每一行创建一个新的字符串。如果我们关心的是最后一个字符串d
,那么带有字符串c
的行会浪费空间,因为当我们不需要它时,它会创建一个新的String
对象。
字符串生成器只是延迟实际构建String
对象,直到您致电.toString()
。此时,它会将内部char[]
转换为实际的字符串。
再举一个例子。
String foo() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++)
sb.append(i);
return sb.toString();
}
在这里,我们只创建一个字符串。 StringBuilder
将跟踪您在内部char[] value
中添加到字符串中的字符。需要注意的是value.length
一般会比你已经添加到您的StringBuilder
总字符较大,但value
可能会用完的空间,要追加什么,如果你正在构建的字符串变得太大。当发生这种情况时,它将调整大小,这意味着将value
替换为更大的char[]
,并将旧值复制到新数组以及随附的任何字符。
最后,当您拨打sb.toString()
时,StringBuilder
将调用String
构造函数,该构造函数的参数为char[]
。
这意味着只有一个String
对象被创建,我们只需要足够的内存用于我们的char[]
并调整它的大小。
比较如下:
String foo() {
String toReturn = "";
for (int i = 0; i < 100; i++)
toReturn += "" + i;
toReturn;
}
在这里,我们已经创建了101个string对象(也许更多,我不确定)。我们只需要一个!这意味着在每次调用时,我们都要处理原始字符串toReturn
,并创建另一个字符串。
有了一个大的字符串,尤其是,这是非常昂贵的,因为在每一个呼叫,您需要首先获取尽可能多的内存新的字符串的需求,并尽可能多的内存处置作为老串了。当事情总是很短时,这不是什么大问题,但是当你处理整个文件时,这很容易成为问题。
简而言之:如果你正在最后敲定输出之前的工作追加/删除信息:使用StringBuilder
。如果你的字符串非常短,我认为可以正常连接以方便连接,但这取决于你自己定义“short”是什么。
你有没有尝试过一些代码..如果是的话请分享,如果不是请... –
'StringBuilder'被设计用来有效地连接字符串。它不是为字符串格式设计的。 Java有'String.format',它可以让你执行'printf'样式格式。你不允许使用这个吗? – sh0rug0ru