微信公众号:爱问CTO
专业编程问答社区
www.askcto.com
JDK1.6中substring中的源码如下:
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
public String substring(int beginIndex, int endIndex) {
return new String(offset + beginIndex, endIndex - beginIndex, value);
}
从源码中看出,substring返回的字符串和之前的字符串是共用的一个字符数组。只是数组的起点和长度改变了。value 是真正存储字符的数组,offset 是数组中第一个元素的下标,count 是数组中字符的个数。调用 substring() 的时候虽然创建了新的字符串,但字符串的值仍然指向的是内存中的同一个数组。
如果有一个长度很长的字符串,当我们需要调用 substring() 截取其中很小一段字符串时,就有可能导致性能问题。由于这一小段字符串引用了整个很长很长的字符数组,就导致很长很长的这个字符数组无法被回收,内存一直被占用着,就有可能引发内存泄露。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。