【问题标题】:String concatenation OutOfMemoryError字符串连接 OutOfMemoryError
【发布时间】:2015-08-07 05:14:16
【问题描述】:

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

【问题讨论】:

  • 正确的迭代次数??
  • sysout 字符串你会明白的

标签: java memory-management memory-leaks


【解决方案1】:

如果你这样做

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

【讨论】:

    【解决方案2】:

    只是一个数学题:

    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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多