35

我们如何修剪一个StringBuilder值而不会因使用而导致的开销,从而为每个修剪调用StringBuilder.toString().trim()创建一个新的String和/或新的实例?StringBuilder

4

5 回答 5

26

为什么 StringBuilder 没有 trim() 方法

  1. 因为它就是这样设计的。尝试询问设计师1
  2. 因为没有太多的呼声。
  3. 因为字符串trim()语义和签名不适合可变字符串,尽管这是有争议的。

无论哪种方式,答案都与解决您的问题无关。

以及我们如何修剪 StringBuilder 值?

最简单的方法是使用StringBuilder.toString().trim()...

我不想使用 StringBuilder.toString().trim()。

在这种情况下,您需要做trim()幕后的工作:匹配并删除前导和尾随空格。由于StringBuilderAPI 不支持正则表达式,因此您需要这样做。即通过从前面向前迭代字符并向后结束以查看需要删除哪些字符,等等。

你确定你不想用简单的方法吗?如果没有,这个问答有一些示例实现、分析、基准测试等:

最后,您可以实现自己的StringBuilder具有trim()方法的类的变体。您可能会使用不同的内部表示,以便在开始时删除字符的操作不会复制字符。(我不推荐这个......但如果你有强烈的实际需求,这是一个选择trim()。)


实际上,我处于一个循环中,我必须将此StringBuilder字符串与许多其他值进行比较,因此如果我StringBuilder.toString().trim()每次调用,它将创建一个新实例,并且我不想每次都创建一个新的 String 对象。

另一方面是从 a 的开头删除字符StringBuilder需要复制所有剩余的字符。

也许您最好将 completeStringBuilder转换为 aString开始,然后当您使用trim()andsubstring()等时,您将不会复制字符2


1 - 对于那些声称这样说“没有建设性”的人,另一种选择是假装我们做出设计决定时在房间里,并且我们确实听到了发生的辩论。但那将是一个谎言。坦率地说,指出这里没有人知道答案是建设性的,不要假装不知道。为什么?因为很多读者不会意识到当时的 Java 设计过程是不透明的。

2 - 在 Java 7 之前,这些方法通过创建一个新的 String 来工作,该 String共享原始的支持数组String......所以您最终只会复制字符串的控制信息。在 Java 7 中,他们更改了 and 的实现,trim因此substring他们使用了 String 构造函数,该构造函数复制了后备数组的子数组。

于 2012-06-19T05:12:17.843 回答
6

I don't know what you are trying to achieve, but if you're worried about performance perhaps you could perform the trim as you are appending to the StringBuilder.

stringbuilder.append(string.trim())

于 2012-06-19T08:20:45.923 回答
2

为什么 StringBuilder 没有 trim() 方法?

嗯..StringBuilder就像String,只是有点不同,它可以在创建后修改,否则它与字符串相同。

字符串生成器

如上面的链接所述,StringBuilder 的主要操作是 append 和 insert 方法。我猜他们被提议支持可变字符串,与StringBuffer. 如果您可以通过对其他方法的少量调用然后所需的方法来完成任务,那又是什么问题。为什么要在多个类中实现相同的实现。

我们如何修剪 StringBuilder 值?

正如其他人所说stringBuilder.toString().trim();

我不想使用StringBuilder.toString().trim().

嗯...选择问题,有什么具体原因吗?

于 2012-06-19T05:14:30.303 回答
0

您可以将StringBuilder实例转换为string以后可以修剪的实例。

sb.toString().trim();//sb is stringBuilder Instance.
于 2012-06-19T05:00:43.670 回答
0

使用StringBuilder.toString().trim()但将其保存在变量中。

例如:

String myTrimmedString = myStringBuilder.toString().trim();

It doesn't have a trim() method because it is very easy and somewhat preferred to use immutable objects. Imagine one thread is trimming the StringBuilder while another is appending to it. Imagine the bugs and weirdness that could cause in your code.

于 2012-06-19T05:17:41.803 回答