【发布时间】:2012-11-19 03:06:57
【问题描述】:
例如,假设我有以下代码:
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);
}
【问题讨论】:
-
查看Strings.substring的源码
-
您可以通过对两个版本进行基准测试自己确认或拒绝:)
-
不要过早优化
-
@JanDvorak 我不是。这只是我坐在课堂上的一个想法,我知道不要做任何与过早优化有关的事情。
-
在一个实际的例子中,为了避免调用 substring(3),你必须获取字符串的长度,然后调用
substring(3, s1.length()),这正是substring(3)所做的(但在更冗长,可读性更低的方式)。在您的示例中,最有效的版本是String s1 = "bar"。
标签: java string performance jvm substring