写点什么

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

  • 2021 年 12 月 25 日
  • 本文字数:996 字

    阅读完需:约 3 分钟

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

substring 有什么用?

substring 返回的是字符串索引位置 beginIndex 开始,endIndex-1 结束的字符串。

来看这个例子:

  1. String x = "abcdef"; x = x.substring(1,3); System.out.println(x);

     

  2.  

输出:

  1. bc

     

下面看看在 JDK 之间,它们的实现原理有什么不一样,及值得注意的地方。

JDK 6

String 背后是由 char 数组构成的,在 JDK6 中,String 包含三个字段:char value[], int offset, int count,意思很简单。

substring 被调用时,它会创建一个新的字符串,但字符串的值还指向堆中同样的字符数组。它们的区别只是数量和下标引用不一样,如图所示。



JDK6 中的部分源码可以说明这个问题。

  1. //JDK 6 String(int offset, int count, char value[]) {    this.value = value;    this.offset = offset;    this.count = count; } public String substring(int beginIndex, int endIndex) {    //check boundary    return  new String(offset + beginIndex, endIndex - beginIndex, value); }

     

  2.  

会有什么问题?

如果一个很长的字符串,但是每次使用 substring(),你只需要很小的一部分。这将会导致性能问题,因为只需要一小部分,却引用了整个字符数组内容。对于 JDK 6,解决方案是使用以下内容:

  1. x = x.substring(x, y) + ""

     

JDK 7,8

JDK6 这种问题在 JDK7+中已经改善了,JDK7+中实际是重新创建了一个字符数组,如图。



JDK7 中的部分源码,JDK8 类似。

  1. //JDK 7 public String(char value[], int offset, int count) {    //check boundary    this.value = Arrays.copyOfRange(value, offset, offset + count); } public String substring(int beginIndex, int endIndex) {    //check boundary    int subLen = endIndex - beginIndex;    return new String(value, beginIndex, subLen); }

     

  2.  

对于 JDK 的这种差异,我们知道就好,现在应该都是 JDK7 及 8 了吧,其实对于小字符串的这种操作性能也是可以忽略不计的。

最后

如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163 相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点 star: https://gitee.com/ZhongBangKeJi/crmeb_java不胜感激 !

JAVA 学习手册:https://doc.crmeb.com技术交流论坛:https://q.crmeb.com

用户头像

还未添加个人签名 2021.11.02 加入

CRMEB就是客户关系管理+营销电商系统实现公众号端、微信小程序端、H5端、APP、PC端用户账号同步,能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、网络营销的一款企业应用

评论

发布
暂无评论
注意:字符串substring方法在jkd6,7,8中的差异