1.概述

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

这篇文章讲的更好:灵魂拷问:Java 的 substring() 是如何工作的?

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

substring有什么用?

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

来看这个例子:

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

输出:

bc

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

JDK 6

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

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

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

/

/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 boundaryreturn  new String(offset + beginIndex, endIndex - beginIndex, value);
}

会有什么问题?

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

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

JDK 7,8

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

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

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

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

M.扩展阅读

灵魂拷问:Java 的 substring() 是如何工作的?

【Java】字符串substring方法在jkd6,7,8中的差异相关推荐

  1. 字符串substring方法在jkd6,7,8中的差异

    转载自 注意:字符串substring方法在jkd6,7,8中的差异 标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这 ...

  2. java字符串反转方法【全】

    搜集的java字符串反转方法,一般用于面试,项目中用的很少··· package com.wsheng.aggregator.algorithm.string;import java.util.Sta ...

  3. java字符串的方法 1118

    java字符串的方法 字符串的定义 方式一 String 变量名 = "内容"; 方式二 String 变量名 = new String(); 方式三 String 变量名 = n ...

  4. Java字符串截取 方法

    在 String 中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容. 方法的重载: public String substring(int beginInde ...

  5. 图解Java的substring()方法底层干了啥?

    JDK 6中substring(int beginIndex,int endIndex)方法的实现与JDK 7中的实现是不同的.在本文中会去解释这些差异.为简单起见,我们用substring()方法表 ...

  6. JAVA 字符串截取方法

    目录 方法一 substring 方法二 StringUtils.substringAfter 方法三 split 方法一 substring String str = "123,496,7 ...

  7. java字符串分割方法.split()的详细用法

    先看看它在java包中的Java API是: java.lang.String 方法总结 (1)按指定普通字符分割: java代码如下:String string="123@456@789& ...

  8. java字符串最长回文串_Java中的字符串回文程序

    java字符串最长回文串 Given a string and we have to check whether it is palindrome string or not. 给定一个字符串,我们必 ...

  9. [转载] Java字符串分割方法

    参考链接: Java中的StringTokenizer方法的示例 2 [size=medium]1.用split()方法进行分割,分割开的子字符串放入数组,然后进行处理. 示例代码如下: public ...

最新文章

  1. HostMonitor使用介绍
  2. android英文文献翻译,有关android技术英文文献翻译
  3. python程序设计报告-20183215 实验三《Python程序设计》实验报告
  4. 设为首页及收藏本页代码 兼容IE和Firefox
  5. 多线程消息监听容器配置[ 消费者spring-kafka配置文件]
  6. Netty入门官方例子
  7. 《图解密码技术》分组密码(1) 概览
  8. 赶紧下载SublimeText并快速设置代码自动补全,效率大大提高
  9. long 比较大小_Long-Term Feature Banks
  10. json数据格式化展示出来
  11. Java最佳实践–高性能序列化
  12. 概率图模型笔记(三)条件随机场(CRF)基础
  13. 对 PInvoke 函数的调用导致堆栈不对称问题
  14. 陶哲轩:一个华裔数学天才的传奇
  15. HDU 5144 NPY and shot(三分法)
  16. 数字电路——流水灯(一)
  17. app store无法下载、安装软件,一直在转圈的一个解决方法
  18. 【转】TinyXML2 入门教程
  19. (搞笑)经典!一些很彪悍的句子
  20. SQL语句增删改查公司-员工3表典型案例

热门文章

  1. 华为Mate 40 Pro钢化膜上手:6.6寸大曲率瀑布屏 黑边加速消失
  2. 骑手送外卖获奖1500多万后又遭撤销,网友:人生大起大落不过如此
  3. 期待已久!iPhone 13将使用带LTPO技术的OLED屏幕
  4. 罗永浩宣布要做带货一哥后,合作单子如雪花般飞来
  5. 双11落下帷幕,天猫、京东战报再创记录,拼多多“失声”...
  6. 看呆了!日本男粉丝凭瞳孔倒影找到偶像住所 实施猥亵...
  7. 十一全国电影票房近8亿元 创春节档以来单日大盘新高
  8. 中兴通讯与北京交通大学、中国移动北京公司签署 “5G战略合作框架协议”
  9. 网约代收垃圾App火了!别笑,垃圾分类下一个就到你了
  10. 联发科完成双模芯片实验室测试 首批5G终端明年一季度问世