String 和 StringBuilder

yfht 2014-06-23 03:51:29
代码一:

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
代码二不跑出异常, 一直在执行???
这是为什么???
...全文
209 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
漆黑之勺 2014-06-26
  • 打赏
  • 举报
回复
引用 3 楼 Yoara 的回复:
1楼和2楼综合起来就差不多了。 你的第一段代码在累计足够多的数据后就溢出了。导致OutOfMemoryError。 而第二段代码只是在方法区(常量池)中生成创建对象,返回引用。当此区域创建的对象多到一定程度,JVM的垃圾回收器就会适量的做GC,所以不会导致溢出。
+1
yfht 2014-06-26
  • 打赏
  • 举报
回复
引用 6 楼 gagewang1 的回复:
[quote=引用 2 楼 shine333 的回复:] 你知道你的区别吗 第一次循环后: 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线性增长
String str = "test Str "; while(true) { str = str + str; System.out.println(str); }String改成指数级增长不会报溢出异常[/quote] String 改成指数级增长 也会溢出
yfht 2014-06-26
  • 打赏
  • 举报
回复
引用 3 楼 Yoara 的回复:
1楼和2楼综合起来就差不多了。 你的第一段代码在累计足够多的数据后就溢出了。导致OutOfMemoryError。 而第二段代码只是在方法区(常量池)中生成创建对象,返回引用。当此区域创建的对象多到一定程度,JVM的垃圾回收器就会适量的做GC,所以不会导致溢出。
这个跟常量池没有关系吧 ? 也没有触发gc吧?
yfht 2014-06-26
  • 打赏
  • 举报
回复
感谢2楼
引用 2 楼 shine333 的回复:
你知道你的区别吗 第一次循环后: 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线性增长
中华雪碧 2014-06-24
  • 打赏
  • 举报
回复
引用 2 楼 shine333 的回复:
你知道你的区别吗 第一次循环后: 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线性增长
String str = "test Str "; while(true) { str = str + str; System.out.println(str); }String改成指数级增长不会报溢出异常
grapepaul 2014-06-24
  • 打赏
  • 举报
回复
引用 2 楼 shine333 的回复:
你知道你的区别吗 第一次循环后: 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线性增长
tony4geek 2014-06-24
  • 打赏
  • 举报
回复
你 用这个 就知道了。
	StringBuilder sb = new StringBuilder("test stringBulider ");
		while(true) {
		   sb.append("test stringBulider ");
		}
Yoara 2014-06-24
  • 打赏
  • 举报
回复
1楼和2楼综合起来就差不多了。 你的第一段代码在累计足够多的数据后就溢出了。导致OutOfMemoryError。 而第二段代码只是在方法区(常量池)中生成创建对象,返回引用。当此区域创建的对象多到一定程度,JVM的垃圾回收器就会适量的做GC,所以不会导致溢出。
shine333 2014-06-23
  • 打赏
  • 举报
回复
你知道你的区别吗 第一次循环后: 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线性增长
lodamemory 2014-06-23
  • 打赏
  • 举报
回复
第一个 StringBulider这个放入的字符串太多了,溢出了。 第二个 是一个一个String的相加,所指向的堆不同。

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧