jdk6和jdk7中substring()方法区别

23 篇文章 0 订阅

substring(int beginIndex, int endIndex)方法在JDK 6和JDK 7里是不同的。了解这些区别可以帮助您更好地使用它们。简便起见,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重新赋值为x.substring(1,3)的结果时,其实是指向一个全新的字符串,如下所示:




然而,这图是不完全正确的或者只能代表在堆中发生了啥?当substring()方法被调用时,在JDK 6和JDK 7中真正做了什么是不同。

3.JDK 6中的substring()方法

String类实现是使用到了char数组。在JDK6里面String类有三个属性char value[], int offset, int count,这三个属性分别表示所存储的真实字符数组,这个字符串是从数组里面哪个索引开始的,以及这个字符串一共有多少个。

当subString()方法被调用之后,就创建了一个新的字符串,但是这个字符串的值(该字符串里面的value[] 属性)仍然指向堆中的char数组。和原来的字符相比只是改变了offset和count属性。示意图如下:

以下的代码可以简单地反映出这个调用机制。

//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()方法的时候,实际上是在堆中创建了一个新char数组


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

原文:

The substring() Method in JDK 6 and JDK 7


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值