java 加和加等于有什么区别、该如何解决

来源:互联网 发布:中山大学网络缴费平台 编辑:程序博客网 时间:2024/05/16 18:04
大家都知道字符串频繁的相加是很消耗内存的,今天我没事干做了个试验,发现使用+号并不会影响内存,而使用+=会很消耗内存。
然后查了下jdk1.6的api,说明如下:
Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。

但是+=依旧很消耗内存,循环二十多次就挂掉了,那么在字符串相加时采用"+"和"+="到底区别在哪?

以下是我做试验的例子
public static void main(String[] args) {

String str = "str_";
int count = 0;
try {
while(true){
count++;
str+=str;//立马挂掉
                                     //str=str+str; //一直没挂掉
}
} catch (Error e) {
System.out.println(count);
e.printStackTrace();
}


}


------解决方案--------------------------------------------------------
怀着好奇的心情,试了下代码。
都挂了。
------解决方案--------------------------------------------------------
还真没遇到过,java.rmi.NoSuchObjectException,测试了下,发现都挂了,全都是因为内存不足。但是内存不足不是+和+=造成的,而是str过大造成的。我认为+和+=并没有本质的区别,只是语法不同而已。另外,每做一次 + 就产生个StringBuilder对象,然后append后就扔掉。下次循环再到达时重新产生个StringBuilder对象,oracle存储过程,然后 append 字符串,如此循环直至结束。如果我们直接采用 StringBuilder 对象进行 append 的话,我们可以节省 N - 1 次创建和销毁对象的时间。所以对于在循环中要进行字符串连接的应用,一般都是用StringBuffer或StringBulider对象来进行 append操作。

------解决方案--------------------------------------------------------
楼主你想干嘛 弄个死循环只为了观察?
------解决方案--------------------------------------------------------
个人任务+与+=没有本质的区别,挂掉的原因跟这两个没有关系,应该是内存溢出了吧,每次循环都会产生一个新的对象(通过stingbuffer或stringbuilder的append方法处理),循环的次数多了,内存中的对象也就越多,剩余的空间也就越来越少,无用的对象得不到释放,最后导致了内存的溢出。
------解决方案--------------------------------------------------------
楼主弄个死循环是在寻找抛异常的刺激吧。呵呵
=和+=的确没有区别 ++  -- 等都一样
但从二楼中学习了。
------解决方案--------------------------------------------------------
可参考:
200分成33个奇数,也就是33个奇数想加等于200,该如何解决   http://www.myexception.cn/vc-mfc/167613.html


相关的主题文章:
  • 小弟我被郁闷到了 创建xml的有关问题
  • Struts2 下载 就会报Connection reset by peer
  • 润乾报表总是很卡,怎么处理
原创粉丝点击