【问题标题】:Is there a substring proxy in scala?scala中是否有子字符串代理?
【发布时间】:2011-11-18 14:53:48
【问题描述】:

将字符串用作字符串对象对于许多字符串处理任务来说非常方便。

我需要提取一些子字符串来处理,Scala String 类为我提供了这样的功能。但这相当昂贵:每次使用 substring 函数时都会创建新的 String 对象。使用元组 (string : String, start : Int, stop : Int) 可以解决性能问题,但会使代码变得复杂。

是否有任何用于创建字符串代理的库,它存储原始字符串、范围限制并与其他字符串函数兼容?

【问题讨论】:

  • 您是否有显示字符串比元组慢的基准,或者您只是在猜测?
  • 只是猜测。元组意味着其他处理方式:逐字符迭代。它比复制字符串来处理它要快。但是startsWith等方便的功能应该手动实现
  • 你说a new String object is created every time substring function is used。是什么让你这么说?因为一般情况下(例如 Sun 的 Hotspot VM)并非如此。
  • 严格来说,每次调用 substring 方法时都会创建一个新的字符串对象。但是,子字符串和原始字符串共享相同的字符数组。

标签: scala


【解决方案1】:

Java 7u6 及更高版本现在将 #substring 实现为副本,而不是视图,因此该答案已过时。


如果您在 Sun/Oracle JVM 上运行 Scala 程序,则不需要执行此优化,因为 java.lang.String 已经为您完成了。

字符串存储为对char 数组的引用,以及偏移量和长度。子字符串共享相同的底层数组,但具有不同的偏移量和/或长度。

【讨论】:

  • 我们实际上在不久前就被这种行为所困扰。我们的一个应用程序使用的内存超出了我们的预期。原来我们有一个短字符串的集合,它是从一个非常大的字符串的子字符串中获得的,它保留了原始字符串的巨大字节数组。 new String(str) 很容易解决了这个问题,但这是一件有趣的事情。
【解决方案2】:

看看the implementation of String(特别是substring(int beginIndex, int endIndex)):它已经如你所愿。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2012-04-09
    • 2016-11-06
    • 2013-01-29
    • 2021-11-10
    • 2012-03-21
    • 2022-01-13
    相关资源
    最近更新 更多