Java——使用String&;的StringBuilder;不是StringBuilder
我正在使用Java——使用String&;的StringBuilder;不是StringBuilder,java,string,stringbuilder,Java,String,Stringbuilder,我正在使用StringBuilder,而不是String,来编写代码 在所有解析和连接过程中,使代码时间高效 但是当我查看它的源代码时,substring()方法 AbstractStringBuilder,因此StringBuilder返回的是String,而不是StringBuilder 这背后的想法是什么 谢谢。substring方法返回不可变的字符串的原因是,一旦您在StringBuilder中获得字符串的一部分,它就必须进行复制。它不能在StringBuilder的内容中间提供一个可变
StringBuilder
,而不是String
,来编写代码
在所有解析和连接过程中,使代码时间高效
但是当我查看它的源代码时,substring()
方法
AbstractStringBuilder
,因此StringBuilder
返回的是String
,而不是StringBuilder
这背后的想法是什么
谢谢。substring方法返回不可变的
字符串的原因是,一旦您在StringBuilder
中获得字符串的一部分,它就必须进行复制。它不能在StringBuilder
的内容中间提供一个可变的“实时视图”,因为否则您将遇到应用于哪个字符串的哪些更改的冲突
由于无论如何都要制作副本,因此它也可能是不可变的:如果您愿意,您可以在其周围构建一个StringBuilder
,并充分理解它是从可变的原始文件分离出来的。从一个StringBuilder
转到另一个包含原始文件段的StringBuilder
,您可以使用:
StringBuilder original = ...;
StringBuilder sub = new StringBuilder().append(original, offset, length);
这本可以作为原创的方法提供,但事实并非如此
除此之外,在进行此类微优化之前,您应该先分析代码。好吧,名称是substring,而不是substringbuilder。您可能正在寻找子序列(int start,int end)
。(顺便问一下,为什么你坚持用粗体而不是code
来格式化代码?@TedHopp-Hopp-nope,这不是问题所在。这和子字符串在代码中是相邻的。@Kayaman你在说什么。自地球诞生以来,本文中就没有“子字符串生成器”。您希望如何使用从substring()
返回的StringBuilder
?关于第二段,这需要双副本而不是单副本,对吗?理论上是可变的“实时视图”其工作方式与子列表
对列表的工作方式大致相同。修改子列表会写入原始列表,修改“SubStringBuilder
”可能会修改backingStringBuilder
@TedHopp,这当然是正确的,不过这需要引入一个公共接口,比如说,MutableString
,在原始的StringBuilder
和(可能是隐藏的)SubStringBuilder
中实现它——与在子列表中实现的方式相同,这实际上是一场噩梦。考虑一下如果你给“子”StrugBu建器添加了什么。这也应该反映在原始版本中吗?使用锁定策略使此实时视图成为可能会破坏StringBuilder
s为了快速而进行非同步操作的目的。因此,为了这个目的,最好创建另一个对象,而不要使用StringBuilder
。无论如何,这是一个有趣的讨论