JDK6与JDK7的substring()方法

本文详细对比了JDK6与JDK7中substring(int beginIndex,int endIndex)方法的不同之处,介绍了该方法如何在两个版本中实现,并讨论了其潜在的性能影响。了解这些差异有助于开发者更高效地利用此方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


substring(int beginIndex, int endIndex) 方法在JDK6与JDK7中是不同的。知道其中的差异有利于你更好的使用他们。为了简单起见,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.substring(1,3)的结果时,它应该指向一个完全新的string对象,如下图所示:




 但这个以上这个图不完全对或者说没有真正指出在内存堆中真正发生的事情。substring()在JDK6和JDK7中调用时是有所不同的。


3、substring() 在JDK6中调用时的情况

字符串string是由char数组支持的,String类包含有3个属性:char value[], int offset,int count。这些属性被用于存储真正在的字符数组,数组的第一个索引位置,以及字符

串的长度。

当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、substring()在JDK6中引起的一个问题

假设有一个很长的字符串,但是每次你只需要其中的一部分通过substring()的方式。 这将会引起性能问题,既然你只需要其中很少的一部分,而你不得不持有整个字符串

在JDK6中用一下方式可以解决这个问题,通过此方式使它指向真正的子字符串:

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

5、JDK7中的substring()

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


参考

1. Changes to substring
2. Java 6 vs Java 7 when implementation matters


原文地址:http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值