gpt4 book ai didi

java - 如何有效地使用 StringBuilder?

转载 作者:行者123 更新时间:2023-11-29 04:57:47 25 4
gpt4 key购买 nike

过去,我一直使用 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 builder 只是延迟实际构建 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.length 通常会大于您添加到 StringBuilder 中的总字符数,但 value 可能会用完所有空间如果您正在构建的字符串太大,您将追加。当发生这种情况时,它会调整大小,这意味着用更大的 char[] 替换 value,并将旧值与字符一起复制到新数组无论你附加什么。

最后,当您调用 sb.toString() 时,StringBuilder 将调用一个 String 构造函数,它接受一个 的参数>char[].

这意味着只创建了一个 String 对象,我们只需要足够的内存来存储我们的 char[] 并调整它的大小。

与以下比较:

String foo() {
String toReturn = "";
for (int i = 0; i < 100; i++)
toReturn += "" + i;
toReturn;
}

在这里,我们创建了 101 个字符串对象(也许更多,我不确定)。不过我们只需要一个!这意味着在每次调用时,我们都会处理 toReturn 表示的原始字符串,并创建另一个字符串。

特别是对于一个大字符串,这是非常昂贵的,因为在每次调用时,您需要首先获取新字符串所需的内存,并释放旧字符串所拥有的内存。当事情保持简短时,这没什么大不了的,但是当您处理整个文件时,这很容易成为问题。

简而言之:如果您在最终确定输出之前添加/删除信息:使用 StringBuilder。如果您的字符串很短,我认为为了方便起见,正常连接就可以了,但这取决于您定义什么是“短”。

关于java - 如何有效地使用 StringBuilder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33131553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com