1、substring()方法做了什么?
substring(beginIndex,endIndex)方法返回一个从beginIndex到endIndex-1的字符串
String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);
输出:"bc"
2、在substring()方法调用的时候都做了什么?
因为字符串 x 是不可变的,当 x 被赋值为x.substring()的时候,x 指向了一个完全新创建的字符串
然而,在jdk源码的底层,在堆内存中,所发生的事情并不是上述那么简单,并且jdk1.6 和 jdk1.7之间存在不同。
3、jdk1.6中的substring()方法
String是由一个char数组来保存的,在jdk1.6中,String类有三个字段:char value[] , int offset, int count
当substring()方法被调用的时候,创建了一个新的字符串,但是新字符串的值,仍然指向对内存中相同的字符串数组
在jdk1.6中哟以下代码:
//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、jdk1.6中的substring()方法可能会引发的问题
如果有一个很长的字符串,并且每次调用substring()方法取得只是很小的一部分字符串
就会出现性能的问题,因为每次取得只是一小部分,如何来解决这个问题?可以调用完substring()方法之后把其变为字符串:
x = x.substring(x, y) + ""
5、jdk1.7中的substring()方法
jdk1.7对jdk1.6的做法进行了改进,每次调用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);
}