在Java中,substring(int k,int y)或substring(int k)是否更有效?

Tux*_*Tux 1 java string performance jvm substring

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

String s1 = "foobar";
s1 = s1.substring(3);
Run Code Online (Sandbox Code Playgroud)

该代码的效率是否低于:

String s1 = "foobar";
s1 = s1.substring(3, 6);
Run Code Online (Sandbox Code Playgroud)

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

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

任何人都可以证实或否认我的假设吗?

编辑:我真的不明白源代码中的这个代码(last 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);
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 10

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

public String substring(int beginIndex) {
    return substring(beginIndex, count);
}
Run Code Online (Sandbox Code Playgroud)

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

1 - 从Java 7更新6开始显然不再正确.但它与您的问题无关.

  • [这里是](http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java).请注意,`substring`调用公共构造函数`String(char [],int,int)`,当然,它会防御性地复制`char []`. (3认同)
  • 从Java 7 Update 6开始,这已不再适用.现在始终复制支持`char []`,使其成为O(n). (2认同)
  • 这非常令人震惊.他们赌博可能不会造成严重破坏. (2认同)