[英]How can I efficiently use StringBuilder?
在过去,我总是使用printf格式化打印到控制台,但我目前的任务(创建发票报告)要求我们使用StringBuilder,但我不知道怎么做,而不是简单地使用每个“”差距需要。 例如......我应该打印出来
Invoice Customer Salesperson Subtotal Fees Taxes Discount Total
INV001 Company Eccleston, Chris $ 2357.60 $ 40.00 $ 190.19 $ -282.91 $ 2304.88
但是我不知道如何使用StringBuilder来排列所有内容。 有什么建议?
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
添加到字符串的char[] value
。 请注意, value.length
通常会大于您添加到StringBuilder
字符总数,但如果您构建的字符串太大,则value
可能会超出您要附加的内容。 当发生这种情况时,它会调整大小,这意味着用更大的char[]
替换value
,并将旧值复制到新数组,以及附加的任何字符。
最后,当你调用sb.toString()
, StringBuilder
将调用一个带有char[]
参数的String
构造函数。
这意味着只创建了一个String
对象,我们只需要为char[]
提供足够的内存并调整其大小。
与以下内容比较:
String foo() {
String toReturn = "";
for (int i = 0; i < 100; i++)
toReturn += "" + i;
toReturn;
}
在这里,我们创建了101个字符串对象(可能更多,我不确定)。 我们只需要一个! 这意味着在每次调用时,我们都会处理原始字符串toReturn
表示,并创建另一个字符串。
特别是对于大字符串,这非常昂贵,因为在每次调用时,您需要首先获得与新字符串所需的内存一样多的内存,并且处理与旧字符串一样多的内存。 当事情保持简短时,这不是什么大问题,但是当你处理整个文件时,这很容易成为一个问题。
简而言之:如果您在最终确定输出之前正在处理附加/删除信息:使用StringBuilder
。 如果你的字符串非常短,我认为为方便起见只是正常连接是可以的,但这取决于你定义什么是“短”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.