2

我的问题是针对同一个 String 对象多次调用 split 或其他 String 方法的情况。

是否有任何流行的 JVM 实现通过将结果存储在内存中以供以后重用来优化此类调用?

它可以这样工作:由于字符串不可变的性质和字符串池的存在,一个表达式

String resource = "A:B:C";
String[] resourceArr = resource.split(":");

每次使用时都会对“A:B:C”和“:”使用相同的字符串对象引用。JVM 可以使用这些引用匹配存储的结果,并在不执行实际解析的情况下提供它。

4

2 回答 2

3

它确实以与优化相同的方式进行substring优化,因为split正在使用substring

public String substring (int start, int end) {
    if (start == 0 && end == count)
        return this;
    // NOTE last character not copied!
    // Fast range check.
    if (0 <= start && start <= end && end <= count) {
        return new String (offset + start, end - start, value);
    }
    throw new StringIndexOutOfBoundsException();
}

请注意,如何substring返回同一字符串的 offset+start 和 end-start 之间的字符范围。换句话说,拆分子字符串实际上是指向原始字符串分配的相同内存的指针。

于 2012-04-19T14:45:46.900 回答
2

不,这会极大地浪费内存——相同的拆分结果需要被重用是非常罕见的,更不用说基于每个字符串的开销了——程序员有选择地进行选择会好得多决定何时以“正常方式”缓存此类结果。

于 2012-04-19T14:44:35.543 回答