1

例如,假设我有以下代码:

String s1 = "foobar";
s1 = s1.substring(3);

该代码的效率是否会低于:

String s1 = "foobar";
s1 = s1.substring(3, 6);

我在想双参数方法在性能方面会更有效,因为单参数方法使用循环遍历索引,直到达到长度。这意味着 JVM 必须调用该length()方法来找出何时停止循环。

但是两个参数方法只循环直到到达最后一个索引号。

谁能证实或否认我的假设?

编辑:我不太了解源代码中的这段代码(最后一个返回语句),但这里是 java String 类源代码:

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
     }
     if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
     }
    if (beginIndex > endIndex) {
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :    // I don't understand this part
         new String(offset + beginIndex, endIndex - beginIndex, value);
}
4

4 回答 4

10

String.substring()是常数时间1,它只是提供原始字符串的较小视图。此外,带有一个参数的版本只是...委托给带有两个参数的版本:

public String substring(int beginIndex) {
    return substring(beginIndex, count);
}

count的返回值在哪里String.length()。您选择哪个版本并不重要,它们都非常快。

1 - 从 Java 7 更新 6 起显然不再适用。但这与您的问题无关。

于 2012-11-30T20:50:41.410 回答
1

我不认为有任何区别。如果您看到 String 类源代码 substring(int beginIndex) ——只需调用 substring(beginIndex, lengthOfTheString)

于 2012-11-30T20:52:25.130 回答
1
 public String substring(int beginIndex, int endIndex) 

稍微快一些,因为

 public String substring(int beginIndex) {
      return substring(beginIndex, count);
 }

所以你会避免一种间接。但这不值得考虑。

于 2012-11-30T20:52:29.730 回答
0

在java源代码中,substring(beginIndex)会调用substring(beginIndex, count)

于 2012-11-30T20:52:31.343 回答