繁体   English   中英

我怎样才能有效地使用StringBuilder?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM