原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/

在JDK 6和JDK 7中substring(int beginIndex,int endIndex)的实现是不同的,下面将会做出详细的解释。为简单起见,substring()方法表示的substring(int beginIndex,int endIndex)在这篇文章中的方法。

1.substring()方法

substring(int beginIndex,int endIndex)方法的返回值是,从beginIndex开始到endIndex-1结束的字符串.

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

输出结果:

bc

2.执行substring()的时候底层的运行机制是什么?

你可能知道,字符串x是不可变的,当x执行subtring(1,3)方法时候,返回值指向了一个新的字符串。如下图所示:

然而,这个图表并不完全正确。JDK 6和JDK 7在执行substring()究竟发生了什么呢?

3.substring()方法在JDK6中的使用。

字符串后端是char数组形式保存的。在JDK 6中,字符串包含3个字段:char value[],int offset,int count。它们用于存储真正的字符数组、数组的第一个索引、字符串中的字符数。

当substring()方法被调用时,它将创建一个新字符串,字符串的值但仍然指向堆中的同一个数组。两个字符串之间的差值是它们的计数和偏移值。

下面的代码简化了,只包含解释这个问题的关键点:

//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);
}

4.一个在JDK 6 substring()引发的问题。

如果你有一个很长的字符串,但是你只需要一小部分,每次用substring()。这会导致性能问题,因为你只需要一小部分,你就保留整个事情。JDK 6,解决的办法是使用以下,这将使它指向一个真正的子串:

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

5.substring()方法在JDK7中的使用。

这是在JDK 7的改进。JDK 7中的方法,substring()实际上创建在堆一个新的数组

//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);
}

转载于:https://www.cnblogs.com/zjiacun/p/8278044.html

在JDK 6和JDK 7的substring()方法的区别?相关推荐

  1. JavaScript substr() 和 substring() 方法的区别

    JavaScript substr() 和 substring() 方法的区别 substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, l ...

  2. JS截取字符串substr 和 substring方法的区别

    substr 方法 返回一个从指定位置开始的指定长度的子字符串.stringvar.substr(start [, length ])参数 stringvar必选项.要提取子字符串的字符串文字或 St ...

  3. java substr函数_oracle 中的substr()函数的用法,以及与java中String.substring()方法的区别...

    oracle 中的substr()函数的规则是 substr( string, start_position, [ length ] ) 说明: string 是要分割的字符串 start_posit ...

  4. The substring() Method in JDK 6 and JDK 7

    2019独角兽企业重金招聘Python工程师标准>>> 1. What substring() does? The substring(int beginIndex, int end ...

  5. The substring() Method in JDK 6 and JDK 7 (jdk6中的substring()会造成内存泄漏)

    参考:http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ The substring(int be ...

  6. JDK 7和JDK 8中大行读取速度较慢的原因

    我之前发布了博客文章"使用JDK 7和JDK 8读取慢速行",并且在该问题上有一些有用的评论来描述该问题. 这篇文章提供了更多解释,说明为何该文章中演示的文件读取(并由Ant的Li ...

  7. eclipse中使用maven创建项目JDK版本默认是1.5解决方法

    请看解决方案: 1. 修改maven的settings.xml文件. 添加以下行,jdk版本改为自己需要的版本: <profile> <id>jdk-1.7</id> ...

  8. IBM JDK,SUN JDK,BEA JDK区别在哪里?

    这是java.sun.com网站上的一张关于JDK构成的图片说明.其中每一个方框(例如AWT,String,IDL,JDBC...)表示JDK的一个"技术领域". 不知道SUN J ...

  9. JDK 8与JDK 10:三元/拆箱的区别

    最近的Nicolai Parlog ( @nipafx ) 鸣叫引起了我的注意,因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 ,并询问"为什么?& ...

最新文章

  1. OpenCV(项目)车牌识别3 -- 模板匹配
  2. 推荐!最适合初学者的18个经典开源计算机视觉项目
  3. 天翼云从业认证(3.1)了解天翼云计算产品
  4. python运行是哪个键_python – 如何使用回车键调用按钮命令
  5. 【转】有限状态机(FSM)学习总结C#
  6. Python练习:站队顺序输出
  7. c语言warning scanf,【C】将m~n之间的素数输出与VS2005以上版本对C语言的scanf的警告warning C4996...
  8. 在React的render方法中使用箭头函数
  9. kafka 不同分区文件存储_Kafka 系列(二)文件存储机制与Producer架构原理怎样保证数据可靠性??...
  10. CSS样式切换技巧 - 动态更换网页色彩皮肤
  11. Android GridView 分页加载数据
  12. 损失函数的意义和作用_BN究竟起了什么作用?一个闭门造车的分析
  13. kafka集群安装配置
  14. 自己制作一个计时器、倒计时器
  15. dynamo for Civil 3d-在横断面上生成对应桩号的平面坐标
  16. mysql创建表里主码和外码_SQL语言创建表时候怎么定义主码和外码
  17. 手机2020 QQ 群文件下载存储路径
  18. matlab 画卫星轨道,Matlab仿真实例-卫星轨迹
  19. 赶紧收藏3个免费在线资源齐全的网站
  20. R语言使用lm函数构建回归模型、使用broom包的augmented函数将模型结果存入dataframe中、使用ggplot2可视化回归残差图(拟合值和残差值的关系图)

热门文章

  1. JavaScript 正则表达式的使用
  2. eclipse工程设置项目jre
  3. mvc后台字符串转换html,在mvc中,使用summernote编辑器,我想发送数据的内容字符串和HTML到控制器...
  4. lob移表空间 oracle_移动一个带有lob字段的表到另外一个表空间
  5. pytorch使用 torchvision 的 Transform 读取图片数据
  6. Git错误:fatal: Not a git repository (or any of the parent directories)解决方法
  7. Aurora 8B/10B、PCIe 2.0、SRIO 2.0三种协议比较
  8. c++类的构造函数详解
  9. java读取本地文件_java 读取本地文件实例详解
  10. 从源码分析DEARGUI之add_tree_node