我们如何修正StringBuilder
的值,而不会因为使用StringBuilder.toString().trim()
而导致的开销,从而为每个修剪调用创建新的String
和/或新的StringBuilder
实例?如何修剪StringBuilder的字符串?
回答
为什么StringBuilder的没有TRIM()方法
- 因为这就是它设计的方式。试着问设计师。
- 因为没有太多的要求。
- 由于字符串
trim()
语义和签名不适合可变字符串,尽管这是有争议的。
无论哪种方式,答案与解决您的问题无关。
以及如何修剪StringBuilder值?
最简单的方法是使用StringBuilder.toString().trim()
...
我不想使用StringBuilder.toString()。修剪()。
在这种情况下,所以你需要做什么trim()
在封面下做:匹配并删除前导和尾随的空白。由于StringBuilder API没有正则表达式支持,所以你需要这么做;即通过从前面向前和向后反复查看字符来查看需要删除哪些字符,等等。
你确定你不喜欢这么简单吗?如果没有,这个问答& A有一些示例实现,分析,标杆管理,等等:
其实我在一个循环,我要比较这StringBuilder的字符串与许多其他值,所以如果我每次调用StringBuilder.toString()。trim(),它将创建一个新的实例,我不想每次都创建一个新的String对象。
另一方面是从StringBuilder的开头删除字符需要复制所有剩余的字符。
也许你最好把整个StringBuilder转换成一个字符串开始,然后当你使用trim()
和substring()
之类的时候,你不会复制字符。 (这些方法的工作原理是创建一个新的字符串,其中股份原始字符串的支持数组... ...所以你最终只能复制字符串的控制信息。 UPDATE - 在Java 7中,他们改变的trim
行为和substring
让他们使用String构造那份支持数组的一个子)
正在审阅你的类似答案:http://stackoverflow.com/questions/7510422/when-should-we-change -a-string-to-a-stringbuilder。我会说你已经很好地回答了这个问题。 –
@KazekageGaara - 谢谢你:-) –
“为什么不发生?因为它不会发生”。非常有建设性。你碰巧知道设计师没有实现toString()的原因吗? – Buffalo
您可以将StringBuilder
实例转换为string
,稍后可以将其修剪。
sb.toString().trim();//sb is stringBuilder Instance.
为什么StringBuilder的没有TRIM()方法?
嗯.. StringBuilder
就像String
,只是有一点区别,它可以创建其他后修改了它是一样的字符串。
如上链接所述,上一个StringBuilder的主要操作是追加和插入方法。我想他们提议支持可变字符串,与StringBuffer
一样。如果你能通过一些其他方法的小调用,然后想要的方法来完成事情,那么最新的事情。为什么你想在多个类中实现相同的实现。
我们如何修剪StringBuilder值?
至于说其他人stringBuilder.toString().trim();
我不想使用
StringBuilder.toString().trim()
。
嗯...选择的问题,这是什么具体原因?
实际上,我在一个循环中,我必须将此StringBuilder字符串与许多其他值进行比较,所以如果我调用StringBuilder .toString()。trim(),它会创建一个新的实例,我不想每次创建一个新的String对象。 –
然后使用你自己的'char []'和分隔符。检查'java.lang.String'代码。 – mschonaker
使用StringBuilder.toString().trim()
但将其保存在一个变量中。
例如:
String myTrimmedString = myStringBuilder.toString().trim();
它不具有trim()
方法,因为它是非常容易的,有点优选使用不可变对象。想象一下,一个线程正在修剪StringBuilder
而另一个线程正在追加它。想象一下在你的代码中可能导致的错误和怪异。
想象一下,一个线程正在修剪StringBuilder而另一个线程正在追加它。 这种情况也可以发生在追加操作中,而一个线程正在追加某些东西,另一个追加了其他东西......那么在那种情况下呢?它不应该支持追加 –
@PramodKumar我会想象虚拟机只允许一次写入char []。然而,对读取操作施加相同的限制将是荒谬的。在同时读写时,我猜想它会阻止读取,这是一个非问题。这一切都取决于VM的实施。 trim()很可能会正常工作。显示实现不可变对象有多容易是一种假设情况。他们使用更少的内存。 – iracigt
虽然你的解决方案是正确的,但你的理由是没有道理的。 StringBuilder不是线程安全的,因此,正如Pramod Kumar所说的那样,**任何**并发操作都是危险的。任何在多个线程中使用StringBuilder而没有同步的人都需要拍摄。 StringBuffer是StringBuilder的线程安全版本,因为它使用内部同步。 *(StringBuilder是在Java中引入的,如果您确信一次只有一个线程可以访问它,并且希望在没有在StringBuffer中同步的开销的情况下执行此操作)。 – megaflop
我不知道你在努力达到什么,但是如果你担心性能问题,也许你可以在追加到StringBuilder的时候执行trim。
stringbuilder.append(string.trim())
- 1. 修剪字符串
- 2. 修剪字符串
- 3. 修剪字符串
- 4. 修剪字符串
- 5. 如何修剪BASIC中的字符串?
- 6. 如何修剪字符串的文件
- 7. 如何修剪ClientValidationFunction中的字符串
- 8. 修剪字符串NHibernate的
- 9. 字符串修剪/子字符串C#
- 10. 试图修剪'字符串'字符串?
- 11. 如何修剪此JavaScript字符串?
- 12. 如何从空间修剪字符串
- 13. 如何修剪一个字符串?
- 14. 如何在JavaScript中修剪字符串?
- 15. 如何修剪字符串格式char []?
- 16. 如何修剪以下字符串?
- 17. 如何在AppleScript中修剪字符串?
- 18. 如何通过符号修剪/剪切java中的字符串?
- 19. 如何修剪在“()”中有子字符串的字符串?
- 20. 完全修剪字符串
- 21. 修剪字符串在Javascript
- 22. 修剪字符串与Dapper.NET
- 23. php修剪字符串
- 24. Swift修剪字符串
- 25. 回声修剪字符串
- 26. 修剪字符和修剪字符串 - Python
- 27. 从字符串修剪字符
- 28. 如何在Python中修剪字符串的n个字符?
- 29. 如何从字符串的开头修剪字符。 Android
- 30. Xcode中如何修剪与特殊字符的字符串$
我可以问你为什么不希望使用'StringBuilder.toString()。修剪()'? –
其实我在一个循环中,我必须比较这个StringBuilder字符串与许多其他值,所以如果我每次调用StringBuilder.toString()。trim(),它会创建一个新的实例,我不想创建一个每次都有新的String对象。 –
您可以根据需要多次使用'toString()。trim()'。请编辑您的问题并添加您以前的评论以澄清。 – mschonaker