码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-10-19 17:40:28      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

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);
System.out.println(x);

Output:

   bc

2、当substring()方法被调用时发生了什么?

你可能知道x是不可变的,当x指向x.substring(1,3)的结果后,它实际上指向一个完全新的字符串如下:

技术分享

然而,这张图并不准确或者它表现的是堆里面真正发生了什么。那当substring()方法被调用时,JDK6和JDK7真正发生了什么不同呢

3、substring() 在 JDK6

String 是由字符数组表现的。在JDK6,String 类包含3个字段:char value[],int offset,int count.  它们用来存储真正的字母数组,数组的第一个坐标,String当中字母的数量。

当substring()被调用时,它创建了一个新的字符串,但是在堆中字符串的值还是指向同样的数组。两个字符串不同的只是count和offset的值。

技术分享

下面的代码简化并且是关键地说明这个问题

//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、在JDK6的substring()的问题

如果你有很长的字符串,但你每次调用substring()仅仅需要一小部分时,这会引起性能问题。因为你仅仅需要一部分,却要保持整个空间。对于JDK6,下面是一个解决方法,这能让它指向真正的子串:

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

5、在JDK7中的substring()

在JDK7有改进,在JDK7中,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);
}

(译完,原文链接:http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/)

针对第四点,个人补充一下:

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

上述代码实现过程如下:

StringBuilder sb = new StringBuilder();
sb.append(x.substring(x, y));
sb.append("");
x = sb.toString();

用下面的方法代替:

x = new String(x.substring(x, y));

这样节省了一个对象引用和一点点时间。

个人观点,如有问题,欢迎留言交流~








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

标签:

原文地址:http://my.oschina.net/dailongyao/blog/518946

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!