【问题标题】:Java do while loop arralyist problemJava做while循环arralyist问题
【发布时间】:2011-02-19 03:31:58
【问题描述】:

想问一下为什么执行“NAME.add("Tom");”时会触发Java堆空间?

<%@ page import="java.util.*" %>

<%
try {
    ArrayList <String> NAME = new ArrayList<String>();
    int count= 0;

    do
    {
        NAME.add("Tom");
    } while ( count < 2);

    String[] name = NAME.toArray(new String[NAME.size()]);

%>

<script type="text/javascript">
    var output=[];
    <%int i = 0;%>

    <%while ( i < name.length ) { System.out.println(name[i]);%>
        output[<%=i%>] = [];
        output[<%=i%>][0] = '<%=name[i]%>';

    <% System.out.println("No exception in JAVASCRIPT.");i++;}%>
</script>

<%
} catch (Exception error ){System.out.println(error);}%>

【问题讨论】:

    标签: java arrays arraylist


    【解决方案1】:

    注意在这段代码中:

    int count= 0;
    
    do
    {
        NAME.add("Tom");
    } while ( count < 2);
    

    您永远不会在任何地方更改count 的值,因此这个循环将永远循环。如果您更改代码以便以某种方式更改count(也许通过使用for 循环向上计数),这应该会消失。通过将尽可能多的Tom 副本添加到集合中,JVM 可能耗尽了堆空间,最终耗尽了可用内存。

    【讨论】:

    • 该列表不会真正包含"Tom" 的副本,只有很多很多对同一个"Tom" 对象的引用。尽管如此,每个引用都占用 4(或 8)个字节,它们最终会填满堆。
    【解决方案2】:

    您没有增加 count 变量。

    【讨论】:

      【解决方案3】:

      看看这段代码

      int 计数= 0; 做 { NAME.add("汤姆"); } while (count

      您忘记增加count。所以在你的代码中,它会做一个无限循环,你所有的内存都会被占用。

      【讨论】:

        猜你喜欢
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        相关资源
        最近更新 更多