JDK6中subString()的源码
01 | //JDK 6 |
02 | String( int offset, int count, char value[]) { |
03 | this .value = value; |
04 | this .offset = offset; |
05 | this .count = count; |
06 | } |
07 | public String substring( int beginIndex, int endIndex) { |
08 | //check boundary |
09 | return new String(offset + beginIndex, endIndex - beginIndex, value); |
10 | } |
实际上substring并没有去new 一个String对象,substring返回的字符串和之前的字符串是共用的一个字符数组。
只是数组的起点和长度改变了。所以之前的那个被截取的字符串就没有(也不能)被回收。
如果你想要让它能被回收,可以这样substring.
1 | x.substring(a,b)+ "" |
2 | //or |
3 | new String(x.substring(a,b)) |
前者等同于:
1 | StringBuilder sb = new StringBuilder(); |
2 | sb.append(x.substring(x, y)); |
3 | sb.append( "" ); |
4 | x = sb.toString(); |
所以,使用new String(x.substring(a,b))的方式效率更高。