请问下面的循环执行完共创建了多少个String对象?为什么呢?

07-08-13 qiullin
String str = null;

for(int i = 0;i < 20; i++){

str = "ABCD"+i;

}

我想的是40个,20个常量字符对象和20个指向它们的指针对象

不知道对不对呢?

myseo
2007-08-14 09:34
你的答案是说“创建了多少个对象”

qiullin
2007-08-14 10:55
是多少个String对象!请赐教!小弟疑惑中,谢谢各位。

ghostv1
2007-08-30 15:47
指针对象应该只有一个“str”

String对象我的想法是:

("ABCD"(1)+i(1)+"ABCDi"(1))*20=60

blackbat
2007-09-09 12:37
同意楼上的 这种就该使用StringBuilder来 节约资源

boyszz
2007-09-09 17:04
研究这类问题有何意义

slangmgh
2007-09-10 10:22
虽然比较无聊,但是也能够学到一些东西。

首先,编译器在编译字符串和别的相加的时候是用StringBuffer的(1.5以上版本使用StringBuilder)。所以代码其实会变成:

for (int i = 0; i < 20; i++) {

str = new StringBuffer("ABCD").append(i).toString();

}

其中append(i)会转换成Interger.appendTo(i, this),执行过程中对0到10会产生字符串(其实也是在常数池中的),其他的不产生新字符串。

唯一产生字符串的是toString()方法调用。

所以执行完成后总共创建了31个字符串,如果加上"ABCD"的话,就是32个。

[该贴被slangmgh于2007年09月10日 10:31修改过]

javafansmagic
2007-09-11 13:13
StringBuilder strBuilder = new StringBuilder("ABCD");

for(int i = 0; i < 20; i++) {

strBuilder.append(i);

}

str = strBuilder.toString();

只有两个对象,str和strBuilder,还有i转换的零时字符串。

猜你喜欢