Java Pattern.matcher(StringBuffer),为什么它的行为与Pattern.matcher(String)的行为不同?

时间:2012-12-22 13:32:11

标签: java regex string parsing

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

我面对的是我必须使用的情况:

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

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

很难说没有看到代码,但你可以改为使你的模式更通用吗?像“。* original-pattern”这样的东西?