【问题标题】:Java for( x : y) executionJava for( x : y) 执行
【发布时间】:2011-09-07 03:50:10
【问题描述】:

我有以下 for 循环:

for(String s : someString.split("\\s+")){
   //do something
}

java 是在每次循环迭代时执行 split() 方法,还是只执行一次并保留一个临时数组进行迭代?

【问题讨论】:

    标签: java string loops for-loop


    【解决方案1】:

    它只执行一次,并使用该数组并通过它进行交互。

    编辑:来自 Mat 这是reference

    【讨论】:

    【解决方案2】:

    它在使用之前将数组存储在一个临时变量中。

    【讨论】:

      【解决方案3】:

      没有在字符串上执行一次拆分,然后循环遍历结果

      【讨论】:

        【解决方案4】:

        split 方法只调用一次。考虑如下结构(也称为 for-each):

        • 第二个参数在循环期间被评估并保留。
        • 如果参数给出一个 Iterable 或者是一个数组(特殊情况),则检查第一个参数的类型是否与返回的元素相对应。
        • 进程进入循环并执行范围内的代码,当没有剩余元素时退出。

        更多信息可以在这里: http://www.leepoint.net/notes-java/flow/loops/foreach.html

        P.S:这适用于最低 Java 5。

        【讨论】:

        • 另外,如果“数组是可迭代的”是指数组实现了Iterable 接口,那就错了。
        • 也许吧。很难说像 Eclipse 这样的 IDE 在强调问题时会进行某种形式的编译。
        • @trutheality:我的意思是该数组在拆箱后将表现为一个 Iterable。我承认这是一个假设,我很想知道 Java 是否真的以不同的方式处理这个问题。 download.oracle.com/javase/1.5.0/docs/guide/language/…
        • “表达式必须是 Iterable 类型,否则它必须是数组类型,否则会发生编译时错误。” - 来自 Mat 发布的 JLS 参考文献
        • @James P.this 是我理解它的工作原理:如果第二个参数是一个数组,则循环被解释为for(i=0;i<array.length;i++),如果第二个参数实现Iterable 它使用for 循环的迭代器。拆箱是一个单独的功能,有时可以方便地与 foreach 结合使用,例如for( int n : list ),其中listIterable<Integer>
        猜你喜欢
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 2015-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多