Java字符串的截取操作可以通过substring来完成。有意思的是,这个方法从jdk1.0开始,一直到1.6都没有变化,但到了1.7实现方式却发生了改变。你可能会认为之所以要对一个成熟且稳定的方法做修改,一定是因为新的实现更好、效率更高吧?然而正好相反,修改后的substring的效率变低了,并且占用了更多的内存,无论是从时间上还是空间上都比不上原有的实现。下面我们来做一个比较,看看到底哪一个更好,以及为什么新版Java中要对其进行修改。
原有实现
我们首先来看看原来的substring方法。前面是对参数进行检查,重点是最后一句:
return ((beginIndex == 0) && (endIndex == count)) ? this:new String(offset + beginIndex, endIndex - beginIndex, value);
这里通过调用下面这个构造方法来创建一个新的字符串:
//Package private constructor which shares value array for speed.
String(int offset, int count, charvalue[]) {this.value =value;this.offset =offset;this.count =count;
}
我们知道,Java的字符串实际上是用一个字符数组来实现的,这个构造方法通过复用字符数组value,省去了数组拷贝的开销,仅通过3个赋值语句就创建了一个新的字符串对象。从注释也可以看出这个构造方法的意图就是为了提升性能。
新的实现
我们再来看看1.7中新的subs