0

我需要在循环中“缩短”一个字符串,然后再一次又一次地传递它以匹配java.regex.Pattern. 对于一些深入参与解析和文本处理的人来说,这可能是一种微不足道的情况。

我面临着我必须使用的情况:

string=string.substring(shortenHowMuch); //Need to shorten it from the beginning

...低级开发人员非常清楚,即将整个字符串复制到内存的另一个地址。即使有 HotSpot 的优化(我知道),我仍然需要确保代码在所有可能的 Java VM 上以最大可能的性能变体运行。

编辑: 后来我发现,我上面的声明,它正在复制字符串,是错误的。所以我的问题应该“下地狱” :) 无论如何,如果你喜欢,请阅读 :).substring不会复制,而是共享对 a 的引用char[],非常有趣:)

4

2 回答 2

3

您没有解释使用 StringBuilder 时到底发生了什么,所以我无法回答原因。但实际上您不需要 StringBuilder 因为 String.substring 已优化并且它不会复制内部 char 数组。这是内部发生的事情

public String substring(int beginIndex, int endIndex) {
        ..... 
        return ((beginIndex == 0) && (endIndex == count)) ? this :
            new String(offset + beginIndex, endIndex - beginIndex, value);
 }

// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}
于 2012-12-22T13:59:08.913 回答
0

不看代码就很难说,但你可以让你的模式更通用吗?像“.* original-pattern”这样的东西?

于 2012-12-22T13:51:00.657 回答