【问题标题】:Java -- StringBuilder using String & not StringBuilderJava——使用String而不是StringBuilder的StringBuilder
【发布时间】:2013-11-12 16:24:21
【问题描述】:

我正在努力在代码中使用StringBuilder,而不是String 在所有解析和连接过程中使代码高效。

但是当我查看它的来源时,substring() 的方法 AbstractStringBuilder 因而 StringBuilder 返回的是 String 而不是 StringBuilder

这背后的想法是什么?

谢谢。

【问题讨论】:

  • 嗯,名字是substring,而不是substringbuilder
  • 您可能正在寻找subSequence(int start, int end)。 (PS,为什么你坚持使用 bold 而不是 code 格式化代码?)
  • @TedHopp Hopp 不,那不是 Q。代码中的子字符串是相邻的。
  • @Kayaman 你在说什么。自地球创建以来,本文中就没有“子字符串生成器”。
  • 您希望如何使用从substring() 返回的StringBuilder

标签: java string stringbuilder


【解决方案1】:

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

由于无论如何都要制作副本,它也可能是不可变的:如果您愿意,可以通过在它周围构造​​一个 StringBuilder 来轻松地使其可变,并充分理解它与可变的原始文件分离。

【讨论】:

  • 关于第二段,那需要双份而不是单份,对吧?
  • 理论上,可变“实时视图”的工作方式与subList 用于列表的方式大致相同。改变子列表写入原始列表,改变“SubStringBuilder”可以改变支持StringBuilder
  • @TedHopp 这当然是真的,尽管这需要引入一个通用接口,比如MutableString,并在原始StringBuilder 和(可能是隐藏的)SubStringBuilder 中实现它 - - 与subList 中的方法相同。
  • @TedHopp 这实际上是一场噩梦。考虑如果将某些内容附加到“子”StringBuilder 会发生什么。这也应该反映在原著中吗?
  • 拥有一个锁定策略来使这个实时视图成为可能会破坏StringBuilders 非同步操作的目的,以便更快。所以也许最好为整个目的创建另一个对象并单独留下StringBuilder。无论如何,这是一个有趣的讨论。 :)
【解决方案2】:

要从一个 StringBuilder 转到另一个包含原始片段的另一个,您可以使用:

StringBuilder original = ...;
StringBuilder sub = new StringBuilder().append(original, offset, length);

这个可以作为original的方法提供,但目前情况并非如此。

除此之外,您应该在进行此类微优化之前分析您的代码。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多