substring(),
分享于 点击 5203 次 点评:41
substring(),
substring()返回的字符串并不会真正复制原字符串的byte数组的一部分,而只是指向原字符串的byte数组的某个区间,这个特性决定了它的执行效率是很不错的,在内存使用方面则根据具体情况可能有两极化的表现。一般来说,由于substring()没有为子字符串申请新的空间,它有节约内存空间的作用。
但在有些情况下,它反而浪费内存空间,因为它会导致它所基于的原字符串无法释放,从而不能被垃圾回收,如:
public String getSub() {
String total=.......
return total.substring(0,1);
}
String sub = getSub();
total本来是个局部变量,getSub()结束就可以被释放,但由于sub的存在,它无法被释放。如果total是个很长的字符串,sub相对来说短得多,就不是好事了。
要解决这个问题也很简单,用intern()就可以了,如:
public String getSub() {
String total=.......
return total.substring(0,1).intern();
}
String sub = getSub();
这时系统会为sub的数据单独开辟一个独立的内存空间,原字符串total在getSub()结束就可被垃圾回收了。
总的来说,还是要具体情况具体分析,灵活运用,并没有一定的答案,关键是理解背后的机制。
substring()和原字符串是两个不同的字符串实例,这是没有疑问的。
只是由于String是final不可修改的,因此JDK在实现substring时令这两个字符串对象共享了一部分数据,本意应当是节省内存空间。
但当原字符串和子字符串的存活空间不同时,这就未必能节省内存空间。
当子字符串个数很多时,都用intern()也未必就好,所以说要具体情况具体分析。
相关文章
- 暂无相关文章
用户点评