代码一:
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 ");
}