while(true)和Collections

时间:2013-10-17 06:52:01

标签: java collections while-loop

我无法理解这两个代码之间的区别;

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    while (true) {
      list.add("Hello");
    }
  }

在第二个 中抛出java.lang.OutOfMemoryError

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    while (true) {
      list.add("Hello");
      System.out.println(list.size());  // Simply display the size of List
    }
  }

在5分钟后抛出java.lang.OutOfMemoryError ,其中list.size()的值为20767725。

4 个答案:

答案 0 :(得分:8)

简单地说 - 显示2000万行文字需要很长时间。

很容易证明这一点。运行以下代码:

for (int x = 0; x < 20767725; x++) {
    System.out.println(x);
}

我怀疑这也需要大约5分钟。

答案 1 :(得分:3)

表现如预期。在第一个代码中,系统不必等待通信监视(即外部设备)。 RAM与处理器之间的唯一通信是每秒数十亿次计算。所以内存很快耗尽。

在第二个代码中:在每个addtolist之后,该项必须在控制台上显示。接口的输出操作比CPU到RAM的交互要慢很多。因此,该过程将暂停,直到显示“Hello”,并再次继续,因此需要花费大量时间。

答案 2 :(得分:1)

System.out.println()是一项IO操作,需要一些时间。这解释了'一秒'和'五分钟'之间的区别。

答案 3 :(得分:1)

System.out.println()需要很多次才能执行,因为它与IO操作有关。