• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

注意:字符串substring方法在jkd6,7,8中的差异。

技术杂谈 勤劳的小蚂蚁 2个月前 (02-11) 65次浏览 已收录 0个评论 扫描二维码

标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的。

substring有什么用?

substring返回的是字符串索引位置beginIndex开始,endIndex-1结束的字符串。
来看这个例子:
  1. String x ="abcdef";
  2. x = x.substring(1,3);
  3. System.out.println(x);
输出:
  1. bc
下面看看在JDK之间,它们的实现原理有什么不一样,及值得注意的地方。

JDK 6

String背后是由char数组构成的,在JDK6中,String包含三个字段:char value[], int offset, int count,意思很简单。
substring被调用时,它会创建一个新的字符串,但字符串的值还指向堆中同样的字符数组。它们的区别只是数量和下标引用不一样,如图所示。
JDK6中的部分源码可以说明这个问题。
  1. //JDK 6
  2. String(int offset,int count,char value[]){
  3.    this.value = value;
  4.    this.offset = offset;
  5.    this.count = count;
  6. }
  7. publicString substring(int beginIndex,int endIndex){
  8.    //check boundary
  9.    return  newString(offset + beginIndex, endIndex - beginIndex, value);
  10. }
会有什么问题?
如果一个很长的字符串,但是每次使用substring(),你只需要很小的一部分。这将会导致性能问题,因为只需要一小部分,却引用了整个字符数组内容。对于JDK 6,解决方案是使用以下内容:
  1. x = x.substring(x, y)+""

JDK 7,8

JDK6这种问题在JDK7+中已经改善了,JDK7+中实际是重新创建了一个字符数组,如图。
JDK7中的部分源码,JDK8类似。
  1. //JDK 7
  2. publicString(char value[],int offset,int count){
  3.    //check boundary
  4.    this.value =Arrays.copyOfRange(value, offset, offset + count);
  5. }
  6. publicString substring(int beginIndex,int endIndex){
  7.    //check boundary
  8.    int subLen = endIndex - beginIndex;
  9.    returnnewString(value, beginIndex, subLen);
  10. }
对于JDK的这种差异,我们知道就好,现在应该都是JDK7及8了吧,其实对于小字符串的这种操作性能也是可以忽略不计的。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:注意:字符串substring方法在jkd6,7,8中的差异。
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00