看了这篇文章 http://www.iteye.com/topic/626801,在这里做个记录。
String类的subString()方法中使用了一个私有的String构造方法,这个构造方法直接将原来的String中的char[]数组的引用,赋予了新创建的String对象,二者共享了char[]。
subString()的部分代码:
其中使用的构造方法代码:
根据注释,共享char[]是为了执行速度。
split()方法间接调用了subString()方法。
要小心subString()的使用,有可能出现文章中所说的情况,实际长度很小的String,却引用了一个长度很大的char[],造成内存的浪费。为了避免这种情况,需要用String的构造方法String(String original)对截取后的String进行构造,String(String original)会重新创建一个char[],只把有效的那些构成String的字符存入其中。
String类的subString()方法中使用了一个私有的String构造方法,这个构造方法直接将原来的String中的char[]数组的引用,赋予了新创建的String对象,二者共享了char[]。
subString()的部分代码:
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
其中使用的构造方法代码:
// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
根据注释,共享char[]是为了执行速度。
split()方法间接调用了subString()方法。
要小心subString()的使用,有可能出现文章中所说的情况,实际长度很小的String,却引用了一个长度很大的char[],造成内存的浪费。为了避免这种情况,需要用String的构造方法String(String original)对截取后的String进行构造,String(String original)会重新创建一个char[],只把有效的那些构成String的字符存入其中。