如何修剪StringBuilder的字符串?[已关闭]

2022-09-01 06:58:44

我们如何在不因使用而导致开销的情况下修剪值,从而为每个修剪调用创建新的和/或新实例?StringBuilderStringBuilder.toString().trim()StringStringBuilder


答案 1

为什么 StringBuilder 没有 trim() 方法

  1. 因为这就是它的设计方式。试着问设计师1.
  2. 因为没有太多的呼吁。
  3. 因为 String 语义和签名不适合可变字符串,尽管这是值得商榷的。trim()

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

以及我们如何修剪StringBuilder值?

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

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

在这种情况下,您需要执行在封面下执行的操作:匹配并删除前导和尾随空格。由于API没有正则表达式支持,因此您需要以这种困难的方式执行此操作;即,通过从前向前和向后向后迭代字符,以查看需要删除哪些字符,等等。trim()StringBuilder

您确定您不喜欢以简单的方式做到这一点吗?如果没有,这个问答有一些示例实现,分析,基准测试等:

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


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

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

也许你最好把完整的变成一个开始,然后当你使用和之类的东西时,你不会复制字符2StringBuilderStringtrim()substring()


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

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


答案 2

我不知道你想实现什么,但是如果你担心性能,也许你可以在附加到StringBuilder时执行修剪。

stringbuilder.append(string.trim())


推荐