在JDK 6和JDK 7的substring()方法的区别?

原文链接: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 boundary
	return  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 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);
}

原文地址:https://www.cnblogs.com/zjiacun/p/8278044.html

时间: 2024-08-07 02:56:41

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

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

substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参数 stringvar 必选项.要提取子字符串的字符串文字或 String 对象. start 必选项.所需的子字符串的起始位置.字符串中的第一个字符的索引为 0. length 可选项.在返回的子字符串中应包括的字符个数. 说明 如果 length 为 0 或负数,将返回一个空字符串.如果没有指定该参数,则子字符串将延续到 stringvar 的最后. 示

(转)JS截取字符串substr 和 substring方法的区别

网址来源:http://www.cnblogs.com/hema/archive/2009/10/21/1587560.html substr 方法返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参数stringvar 必选项.要提取子字符串的字符串文字或 String 对象. start 必选项.所需的子字符串的起始位置.字符串中的第一个字符的索引为 0. length 可选项.在返回的子字符串中应包括的字符个数. 说明如果

The substring() Method in JDK 6 and JDK 7

The substring() Method in JDK 6 and JDK 7 By X Wang The substring(int beginIndex, int endIndex) method in JDK 6 and JDK 7 are different. Knowing the difference can help you better use them. For simplicity reasons, in the followingsubstring() represen

二 、在 JDK 6 and JDK 7中 substring() 方法

在JDK6 和JDK 7 里面substring(int beginIndex, int endIndex)的方法是不同的.知道这种区别会帮助你更好用它们.为了简单期间,下面用substring() 来表示 substring(int beginIndex,Int endIndex) 方法. 1. substring()方法做什么substring(int beginIndex,int endIndex)方法返回一个从beginIndex开始,到endIndex-1结束的字符串. String

linux 下安装jdk及配置jdk环境图解

linux 下安装jdk及配置jdk环境图解 一:先检测是否已安装了JDK 执行命令: # rpm -qa|grep jdk  或   # rpm -q jdk  或  #find / -name jdk* /soft/openfire_java/jdk-7u40-linux-x64.rpm /usr/java/jdk1.7.0_15 /usr/java/jdk1.7.0_15/jre/lib/servicetag/jdk_header.png /usr/java/jdk1.7.0_15/lib

Oracle官网JDK的API离线文档下载方法

最近在学习JAVA开发,使用频率最高的工具莫过于JAVA API,当我们身边没有可连接的网络,而又急需API文档时候,很明显我们需要在我们的电脑存储一份离线文档.下面是去Oracle官网下载API Documentation的步骤: 0.在地址栏输入http://www.oracle.com/index.html 进入Oracle官网,如下图: 1.把鼠标移到Downloads那里,不要点它哦!会看到展开一系列Oracle的产品下载,注意到第一列有个叫做“Popular Downloads” 红

mac x Yosemide(10.10) 下安装 jdk 1.7 (jdk 1.8)

注意: 双击jdk8后, 将 Java 8 Update 05.pkg包拖到Teminal中,可以获得正确的地址, 然后copy该地址替换下文对应的地址,空格等都不能出错.本人已经按照教程跌跌撞撞实验成功. mac x Yosemide(10.10) 下安装 jdk 1.7 (jdk 1.8) 在mac x yosemide 系统中不能正常更新jdk到1.7(1.8)的问题,会弹出上面的错误 提示.很多人就在这里会选择放弃他的jdk升级之旅,或者是还原他的mac系统 .其实没那么复杂.来看看我是

菜鸟译文(三)——JDK6和JDK7中substring()方法的对比

substring(int beginIndex, int endIndex)方法在JDK6和JDK7中是不同的.了解他们的区别可以让我们更好的使用这个方法.方便起见,以下用substring() 代替 substring(int beginIndex, int endIndex). 1. substring()做了什么? substring(int beginIndex, int endIndex)方法返回一个以beginIndex开头,以endIndex-1结尾的String对象. Stri

substring()方法在JDK6和JDK7的不同 (翻译外文博客)

substring(int beginIndex, int endIndex)方法在JDK6和JDK7是不一样的,了解两个版本实现它的不同能让你更好地运用它们. 1.substring()的作用是什么? substring(int beginIndex, int endIndex) 方法返回一个起始位置是beginIndex(包含),结束位置是endIndex-1(包含)的一个字符串.例如: Input: String x = "abcdef"; x = x.substring(1,3