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

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


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

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


我当时认为,两参数方法将是更有效的性能选择,因为单参数方法使用循环遍历索引直到达到长度。这意味着JVM必须调用length()方法来确定何时停止循环。

但是,只有在到达最后一个索引号之前,两个参数方法才会循环执行。

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

编辑:
我不太了解源代码(最后一个return语句)中的代码,但这是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);
}

最佳答案

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

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


其中countString.length()返回的值。选择哪个版本并不重要,它们都非常快。

1-从Java 7更新6开始显然是no longer true。但这与您的问题无关。

07-24 09:34