我正在摆弄Java.lang.String并使用' +'操作员对他们。我很想知道为什么获得以下输出:
使用下面的代码,我可以获得数千次迭代,并且不会抛出任何内存异常:
public static void main(String[] args) {
String str = "hello";
int count = 1;
while (true) {
System.out.println(count++);
str = str + "newString";
}
}
但是,当我添加' str'对于它自己,我在20-30次迭代后得到OutOfMemoryError异常:
public static void main(String[] args) {
String str = "hello";
int count = 1;
while (true) {
System.out.println(count++);
str = str + "newString" +str;
}
}
我在32位操作系统上使用eclipse而没有其他参数,例如Xms或Xmx
答案 0 :(得分:6)
如果你这样做
str = str + "newString";
你的字符串在每次迭代时线性增长9个字符。
Iteration String length
1 5
2 14
3 23
4 32
5 41
6 50
...
30 266
另一方面,如果你这样做
str = str + "newString" + str;
你的字符串呈指数级增长。它在每次迭代时变为两倍+9个字符。
Iteration String length
1 5
2 19
3 47
4 103
5 215
6 439
...
30 7516192759
答案 1 :(得分:0)
只是一个数学:
pow(2,20)远远超过几千。 该字符串长度为5个字符,您可以在每个循环步骤中将其加倍。经过20步后你的字符串是(没有附加“newString”字符串)5 * pow(2,20)长。这是5 242 880个字符的长度,并且在第一个循环中远远超过5 + 9 * 1000 = 45000个字符。编辑来纠正:在第二个循环中你有5 * pow(2,20)+ 9 * sum(pow(2,i),i,0,19)。