最近在做一个游戏Demo,同时开始1000场比赛,过了有半小时,就出现了内存溢出情况。
在网上也java性能优化的帖子,在这里弱弱的问一下,SubString执行效率怎样,有看到帖子中说到
也会照成内存溢出???? 或者有没有更好的办法替代subString, 主要实现字符串的截取功能。
在网上也java性能优化的帖子,在这里弱弱的问一下,SubString执行效率怎样,有看到帖子中说到
也会照成内存溢出???? 或者有没有更好的办法替代subString, 主要实现字符串的截取功能。
2 效率还是可以的
String的字段重点是3个
char[] value; // 用以存放字符
int offset; // 记录当前字符串在value的开始位置
int count; // 当前字符串的长度,也就是.length()对应的值。String b = a.substring(3, 10)的时候,
a.value 直接赋值给b.value,也就是说两者共享的是同一个char[],只是b.offset = 3, b.count = 7
同理String c = b.substring(1, 2),c还是共享同一个char[],只是c.offset = 4, c.count = 1
但在有些情况下,它反而浪费内存空间,因为它会导致它所基于的原字符串无法释放,从而不能被垃圾回收,如:
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()结束就可被垃圾回收了。总的来说,还是要具体情况具体分析,灵活运用,并没有一定的答案,关键是理解背后的机制。
total.substring(0,1).intern();每次的内容不一样。字符串池也会不会爆掉啊
Returns a new string that is a substring of this string. 照这句,感觉是total会被回收的吧。public String getSub() {
String total=.......
return total.substring(0,1);
}
String sub = getSub();total不会被回收更像js里闭包的说法...
效率肯定不差
substring()和原字符串是两个不同的字符串实例,这是没有疑问的。
只是由于String是final不可修改的,因此JDK在实现substring时令这两个字符串对象共享了一部分数据,本意应当是节省内存空间。
但当原字符串和子字符串的存活空间不同时,这就未必能节省内存空间。
当子字符串个数很多时,都用intern()也未必就好,所以说要具体情况具体分析。
看见大侠的回复很有启发,但还是要多问一句,Java code
public getSub() {
String total=.......
TextView.settext(total.substring(0,1));
}这样给控件赋值,是否能安全释放呢??