String与StringBuffer中substring性能分析

时间:2024-03-28 10:12:45

在jdk1.6中,substring的使用要格外引起注意,首先我们来看看substring是如何实现的: 


String与StringBuffer中substring性能分析
 

通过源代码我们看到,直接返回了String对象,我们继续看一下String类的这个构造函数:

 
String与StringBuffer中substring性能分析
 

通过源代码我们清晰的看到其实就是直接修改了offset,和count,那就面临一个问题,如果我当前对象长度是1000,但是我只需要前2个,那么就会浪费掉998,通过给出的注释我们可以看到,这是jdk做的一次性能优化,所以我们在使用的时候要额外的小心空间的浪费。

 

注:String类中trim和split这两个常用的方法也用到了substring方法,所以在使用他们的时候要斟酌一下。

 

提到String就必须提到StringBuffer,同样看看StringBuffer类中的substring是如何实现的:

StringBuffer类调用的是AbstractStringBuilder中的substring方法:


String与StringBuffer中substring性能分析
 
String与StringBuffer中substring性能分析

 

 我们看到了明显的不同:StringBuffer中的substring方法调用的String的构造函数进行了一次数组的copy,这样就不存在String类中的空间浪费的问题了。

 

YY:应该是jdk的作者认为StringBuffer是用来拼接的,所以会比较长,理所当然要重新copy,防止浪费空间,而String一般都不会初始化那么长,所以做了一次offset,count改变达到优化性能,节省时间的母的。

可是笔者发现jdk1.7中String类的substring也是用了copy的方式,是有很多场景会出现从长的String取出短的几位吗?不知道!

不过总结一句:对的时间对的地点使用对的方法才是提高性能的王道。这里做一下简单的分析,大家使用的时候多多注意吧。