JDK6与JDK7的substring()方法,jdk6jdk7
JDK6与JDK7的substring()方法,jdk6jdk7
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/
相关文章
- 暂无相关文章
用户点评