用于(x:y)执行的Java

用于(x:y)执行的Java,java,string,loops,for-loop,Java,String,Loops,For Loop,我有以下for循环: for(String s : someString.split("\\s+")){ //do something } java是每次循环迭代时都执行split()方法,还是只执行一次并保留一个临时数组进行迭代?在使用该数组之前,它将该数组存储在一个临时变量中。它只执行一次,并使用该数组进行交互 编辑:从Mat这是否,对字符串执行一次分割,然后循环迭代结果分割方法只调用一次。将结构(也称为a for each)考虑如下: 第二个参数在循环期间被计算和保留 如果参数提

我有以下for循环:

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

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

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

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


编辑:从Mat这是

否,对字符串执行一次分割,然后循环迭代结果

分割方法只调用一次。将结构(也称为a for each)考虑如下:

  • 第二个参数在循环期间被计算和保留
  • 如果参数提供了一个Iterable或是一个数组(特殊情况),则会检查第一个参数的类型是否与返回的元素对应
  • 进程进入循环并在作用域内执行代码,当没有更多元素时退出
更多信息可在此处查看:


注:这适用于Java 5 minimum。

文档中详细说明了具体发生的情况。如果“数组是iterable”的意思是数组实现了
iterable
接口,那可能是错误的。很难说像Eclipse这样的IDE在强调问题时会进行某种形式的编译。@trutheality:我的意思是,数组在拆箱后会表现为一个Iterable。我承认这是一个假设,我很想知道Java是否真的以不同的方式处理这个问题。“表达式必须具有Iterable类型,否则它必须是数组类型,否则会发生编译时错误。”-来自发布的JLS引用Mat@JamesP.是我理解它的工作原理:如果第二个参数是数组,则循环被解释为(I=0;I)的