Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串串联OutOfMemoryError_Java_Memory Management_Memory Leaks - Fatal编程技术网

Java 字符串串联OutOfMemoryError

Java 字符串串联OutOfMemoryError,java,memory-management,memory-leaks,Java,Memory Management,Memory Leaks,我正在摆弄Java.lang.String,并对它们使用“+”运算符。我很想知道为什么会得到以下输出: 使用下面的代码,我可以进行数千次迭代,并且不会引发内存异常: public static void main(String[] args) { String str = "hello"; int count = 1; while (true) { System.out.println(count++);

我正在摆弄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

str = str + "newString";
您的字符串在每次迭代中线性增长9个字符

迭代字符串长度
1            5
2            14
3            23
4            32
5            41
6            50
...
30           266
另一方面,如果你这样做

str = str + "newString" + str;
您的字符串以指数形式增长。它在每次迭代中变为两倍长+9个字符

迭代字符串长度
1            5
2            19
3            47
4            103
5            215
6            439
...
30           7516192759
如果您这样做

str = str + "newString";
您的字符串在每次迭代中线性增长9个字符

迭代字符串长度
1            5
2            14
3            23
4            32
5            41
6            50
...
30           266
另一方面,如果你这样做

str = str + "newString" + str;
您的字符串以指数形式增长。它在每次迭代中变为两倍长+9个字符

迭代字符串长度
1            5
2            19
3            47
4            103
5            215
6            439
...
30           7516192759
只是一道数学题:

战俘(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)。

只是一个数学问题:

战俘(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)。

正确迭代次数??您将理解多少次?正确迭代次数??您将理解多少次