2015-10-14 48 views
1

在过去,我一直使用printf格式化打印到控制台,但我目前拥有的任务(创建发票报告)希望我们使用StringBuilder,但我不知道如何在不使用“”为每个需要的差距。例如...我应该打印出来如何有效地使用StringBuilder?

Invoice Customer           Salesperson      Subtotal  Fees  Taxes Discount  Total 
INV001 Company           Eccleston, Chris    $ 2357.60 $  40.00 $ 190.19 $ -282.91 $ 2304.88 

但我不知道如何让所有东西排队使用StringBuilder。有什么建议?

+2

你有没有尝试过一些代码..如果是的话请分享,如果不是请... –

+3

'StringBuilder'被设计用来有效地连接字符串。它不是为字符串格式设计的。 Java有'String.format',它可以让你执行'printf'样式格式。你不允许使用这个吗? – sh0rug0ru

回答

2

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”是什么。