微信公众号: 爱问CTO
专业编程问答社区
www.askcto.comJDK1.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() 截取其中很小一段字符串时,就有可能导致性能问题。由于这一小段字符串引用了整个很长很长的字符数组,就导致很长很长的这个字符数组无法被回收,内存一直被占用着,就有可能引发内存泄露。