为什么说“内存中一共有2万多个”对象

zzxwill 2012-08-31 01:48:32
String S1 = “abc”;
For(int I = 0 ; I < 10000 ; I ++)
{
S1 + = “def”;
S1 = “abc”;
}

如果是这样的话,到这个 for 循环完毕后,如果内存中的对象没有被 GC 清理掉的话,内存中一共有 2 万多个了,惊人的数目,而如果这是一个很多人使用的系统,这样的数目就不算很多了,所以大家使用的时候一定要小心。




请问,为什么说“内存中一共有 2 万多个”对象?
...全文
316 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycagml 2012-09-03
  • 打赏
  • 举报
回复
内存中有两万多个对象很正常的!
就像人身体当中,男性一个精子算一个对象。
那和女的一结合,就有成千上亿个对象呢!
万物皆对象,就像以前的一个皇帝有后宫佳丽3000一样。
cooloyty 2012-09-02
  • 打赏
  • 举报
回复
si是一个“指针”,“abc“是一个对象,它们放在不同的代码区域中,si指“abc“,String对象时不可变的,故一旦创建,”abc“就不可改变,重新给s1赋值”abc“这时候s1指向另一个新的对象”abc"上一个“abc"没有东西指向它,不确定时间的就会被GC清理掉
aqingtian005 2012-09-02
  • 打赏
  • 举报
回复
通过String s = “abc”的方法创建字符串"abc"会放到内存中的常量池中,常量池有则指向,没有则创建

所以
执行String s1 = "abc"时,常量池创建了一个对象"abc",s1指向"abc"
执性String s1 + = "def"时,常量池创建对象"abcdef",s1指向"abcdef"

当再执行String s1 = "abc"时,并没有创建对象,只是把s1指向

所有总共才2个对象"abc","abcdef"
yang3wei 2012-09-02
  • 打赏
  • 举报
回复
打错了,String 是不可变的
yang3wei 2012-09-02
  • 打赏
  • 举报
回复
是这样的,String 不是不可变的,你追加的话就会新建一个对象, 用 StringBuffer 或者 StringBuilder 就强很多了
孤雨 2012-09-02
  • 打赏
  • 举报
回复
for循环惹得祸
ncist_jianeng 2012-09-01
  • 打赏
  • 举报
回复
你把"abc"看成是一个对象就知道了
小灰狼 2012-09-01
  • 打赏
  • 举报
回复
因为
1、String 是 final 型,它不能被继承,并且一旦一个String 对象被创建,则这个对象的内容是永远不会被改变了的,也就是说字符串的长度,每个位置的字符是固定的,不会被改变
2、String 的连接,取子串,replace 的方法,都不会修改原来对象,而是生成一个新的对象
lost_guy_in_scut 2012-08-31
  • 打赏
  • 举报
回复
for循环中生成20000个String对象了
keithcai 2012-08-31
  • 打赏
  • 举报
回复
所以要用StringBuffer咯
Alexander 2012-08-31
  • 打赏
  • 举报
回复
还真有那么多,理论上推应该是20002个。

以下是LZ代码对应的字节码:

public static void main(java.lang.String[]);
Code:
0: ldc #2 // String abc
2: astore_1
3: iconst_0
4: istore_2
5: iload_2
6: sipush 10000
9: if_icmpge 41
12: new #3 // class java/lang/StringBuilder
15: dup
16: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
19: aload_1
20: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: ldc #6 // String def
25: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: astore_1
32: ldc #2 // String abc
34: astore_1
35: iinc 2, 1
38: goto 5
41: return

可见,在循环节(#5-#38)中,为了拼接字符串,每次循环都创建了一个StringBuilder实例(#12),之后拼接完成后又通过toString函数生成了一个String实例(#28)。
循环10000次,共创建20000个实例,再加上用作常量的"abc"和"def"两个String实例,一共创建的实例是20002个。
woshisong121 2012-08-31
  • 打赏
  • 举报
回复
这个不知是不是真的

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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