Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java——使用String&;的StringBuilder;不是StringBuilder_Java_String_Stringbuilder - Fatal编程技术网

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
”可能会修改backing
StringBuilder
@TedHopp,这当然是正确的,不过这需要引入一个公共接口,比如说,
MutableString
,在原始的
StringBuilder
和(可能是隐藏的)
SubStringBuilder
中实现它——与在
子列表中实现的方式相同,这实际上是一场噩梦。考虑一下如果你给“子”StrugBu建器添加了什么。这也应该反映在原始版本中吗?使用锁定策略使此实时视图成为可能会破坏
StringBuilder
s为了快速而进行非同步操作的目的。因此,为了这个目的,最好创建另一个对象,而不要使用
StringBuilder
。无论如何,这是一个有趣的讨论