如何在不使用StringBuilder
导致的开销的情况下修剪StringBuilder.toString().trim()
值,从而为每个修剪调用创建新的String
和/或新的StringBuilder
实例?
答案 0 :(得分:19)
为什么StringBuilder没有trim()方法
trim()
语义和签名不适合可变字符串,但这是有争议的。无论哪种方式,答案都与解决问题无关。
我们如何修剪StringBuilder值?
最简单的方法是使用StringBuilder.toString().trim()
...
我不想使用StringBuilder.toString()。trim()。
在这种情况下,您需要执行trim()
所涵盖的内容:匹配并删除前导和尾随空格。由于StringBuilder
API没有正则表达式支持,因此您需要以此方式执行此操作;即通过向前和向后迭代字符来查看需要删除的字符,等等。
你确定你不喜欢这么简单吗?如果没有,这个Q& A有一些示例实现,分析,基准测试等等:
最后,您可以实现自己拥有StringBuilder
方法的trim()
类的变体。您可以使用不同的内部表示,以便在开头删除字符的操作不会复制字符。 (我不推荐这个......但是如果你对trim()
有一个非常实用的需求,那么这是一个选择。)
实际上我在一个循环中,我必须将这个
StringBuilder
字符串与许多其他值进行比较,所以如果我每次调用StringBuilder.toString().trim()
,它将创建一个新实例,我不想每次都创建一个新的String对象。
另一方面,从StringBuilder
的开头删除字符需要复制所有剩余的字符。
也许你最好将完整的StringBuilder
变成String
开始,然后当你使用trim()
和substring()
之类的时候,你就赢了'要复制字符 2 。
1 - 对于那些声称“没有建设性”的人来说,另一种方法是在做出设计决定时假装我们 在房间里我们< em>做了听到发生的辩论。但这将是一个谎言。坦率地说, 是建设性的,指出这里没有人知道答案,也没有假装。为什么?因为许多读者不会意识到那时的Java设计过程是不透明的。
2 - 在Java 7之前,这些方法的工作原理是创建一个新的String,共享原始String
的后备数组...所以你最终只能复制字符串的控制信息。在Java 7中,他们更改了trim
和substring
的实现,以便他们使用String构造函数来复制支持数组的子数组。
答案 1 :(得分:3)
我不知道你想要实现什么,但是如果你担心性能,也许你可以在附加到StringBuilder时执行修剪。
stringbuilder.append(string.trim())
答案 2 :(得分:1)
为什么StringBuilder没有trim()方法?
嗯...... StringBuilder
与String
类似,只是稍有不同,它可以在创建后修改,否则它与字符串相同。
如上面的链接所述, StringBuilder上的主要操作是append和insert方法。我猜他们被提议支持可变字符串,与StringBuffer
相同。如果你可以通过对其他方法的小调用来完成工作,然后是所需的方法,那么问题是什么。为什么要在多个类中实现相同的实现。
我们如何修剪StringBuilder值?
正如其他人所说stringBuilder.toString().trim();
我不想使用
StringBuilder.toString().trim()
。
嗯...选择问题,有什么具体原因吗?
答案 3 :(得分:0)
您可以将StringBuilder
个实例转换为string
,以后可以修剪。
sb.toString().trim();//sb is stringBuilder Instance.
答案 4 :(得分:0)
使用StringBuilder.toString().trim()
但将其保存在变量中。
例如:
String myTrimmedString = myStringBuilder.toString().trim();
它没有trim()
方法,因为使用不可变对象非常容易并且有些优先。想象一下,一个线程正在修剪StringBuilder
而另一个线程正在追加它。想象一下可能导致代码中出现的错误和怪异。