Java for( x : y) 执行
Posted
技术标签:
【中文标题】Java for( x : y) 执行【英文标题】:Java for( x : y) execution 【发布时间】:2011-09-07 03:50:10 【问题描述】:我有以下 for 循环:
for(String s : someString.split("\\s+"))
//do something
java 是在每次循环迭代时执行 split() 方法,还是只执行一次并保留一个临时数组进行迭代?
【问题讨论】:
【参考方案1】:它只执行一次,并使用该数组并通过它进行交互。
编辑:来自 Mat 这是reference
【讨论】:
JLS enhancedfor
statement 文档中详细说明了发生的情况【参考方案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 )
,其中list
是Iterable<Integer>
。以上是关于Java for( x : y) 执行的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Numpy 与原始 Python 计算 0≤y≤10 和 20000 点的 sin(x) 之间的执行时间差异? [复制]