当前位置: 代码迷 >> Java相关 >> String 跟 StringBuilder
  详细解决方案

String 跟 StringBuilder

热度:633   发布时间:2016-04-22 21:05:01.0
String 和 StringBuilder
代码一:

StringBulider sb = new StringBuilder("test stringBulider ");
while(true) {
   sb.append(sb.toString());
}


代码二:

String str = "test Str ";
while(flag) {
   str = str + "test Str ";
}


结果 
代码一抛出了  nested exception is java.lang.OutOfMemoryError: Java heap space
代码二不跑出异常, 一直在执行???     
这是为什么???

------解决方案--------------------
第一个 StringBulider这个放入的字符串太多了,溢出了。
第二个 是一个一个String的相加,所指向的堆不同。
------解决方案--------------------
你知道你的区别吗
第一次循环后:
test stringBulider test stringBulider 
test Str test Str 
第二次循环后:
test stringBulider test stringBulider test stringBulider test stringBulider 
test Str test Str test Str 

第N次循环后
2的N次方个test stringBulider 
2 * (N + 1)个test Str

指数级增长vs线性增长
------解决方案--------------------
1楼和2楼综合起来就差不多了。

你的第一段代码在累计足够多的数据后就溢出了。导致OutOfMemoryError

而第二段代码只是在方法区(常量池)中生成创建对象,返回引用。当此区域创建的对象多到一定程度,JVM的垃圾回收器就会适量的做GC,所以不会导致溢出。
------解决方案--------------------
你 用这个  就知道了。
	StringBuilder sb = new StringBuilder("test stringBulider ");
while(true) {
   sb.append("test stringBulider ");
}
  相关解决方案