Java -- 使用String而不是StringBuilder的StringBuilder

3
我在代码中使用 StringBuilder 而非 String,旨在提高解析和连接的时间效率。
但是当我查看它的源码时,AbstractStringBuildersubstring() 方法以及 StringBuilder 返回的是一个 String 而不是 StringBuilder
这背后的想法是什么?
谢谢。

7
好的,名称应为“substring”,而非“substringbuilder”。 - Kayaman
1
你可能正在寻找subSequence(int start, int end)。(附注:为什么您坚持使用粗体而不是 code格式来编写代码?) - Ted Hopp
@TedHopp 不是那个问题。"substring" 和它在代码中相邻。 - Roam
@Kayaman 你在说什么啊?自地球创造以来,这个文本中从未出现过“substringbuilder”。 - Roam
我只想说,试图使用 StringBuilder 代替 String 有太多潜在的陷阱,这只是你麻烦的开始。 - Charles Forsythe
显示剩余2条评论
2个回答

6
substring 方法返回一个不可变的 String 的原因是,一旦你在 StringBuilder 中获取了字符串的部分,它必须进行复制。它不能为你提供对于 StringBuilder 内容中间的可变 “实时视图”,否则你将遇到要应用于哪个字符串的更改冲突。

既然无论如何都要进行复制,那么最好就让它成为不可变的:如果你想让它变为可变的,则可以构造一个围绕它的 StringBuilder,但需要充分理解它已经与可变的原始内容分离。


1
关于第二段,那需要进行两次拷贝而不是一次,对吗? - NPE
理论上,可变的“实时视图”可以以与列表的subList相同的方式工作。改变子列表会写入原始列表,而改变“SubStringBuilder”可能会改变支持它的StringBuilder - Ted Hopp
@TedHopp 这当然是正确的,尽管这需要引入一个共同的接口,比如 MutableString,并在原始的 StringBuilder 和(可能隐藏的)SubStringBuilder 中实现它 -- 就像在 subList 中所做的那样。 - Sergey Kalinichenko
@TedHopp 这实际上会是一个噩梦。考虑一下如果你向“sub” StringBuilder 添加了一些内容会发生什么。这是否也应该反映在原始字符串中呢? - Ingo
1
为了实现这种实时视图,采用锁定策略会破坏 StringBuilder 非同步操作的目的,以便提高速度。因此,也许最好为此创建另一个对象,并将 StringBuilder 单独留下。无论如何,这是一个有趣的讨论。 :) - jlr
显示剩余4条评论

1
要从一个包含原始片段的 StringBuilder 转到另一个,您可以使用:
StringBuilder original = ...;
StringBuilder sub = new StringBuilder().append(original, offset, length);

这个可能本来可以作为original方法的一部分提供,但现实情况并不是这样。
除此以外,在进行此类微观优化之前,您应该对代码进行剖析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接