Java for( x : y) 执行

14
我有以下的for循环:
for(String s : someString.split("\\s+")){
   //do something
}

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

4个回答

19

它只执行一次,并使用该数组并迭代其中的元素。

编辑:来自 Mat,这是参考文献


6
具体发生的情况在JLS增强for语句文档中有详细说明。 - Mat

3

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


2
不,字符串只被分割一次,之后循环迭代结果。

1

split方法只被调用一次。将结构(也称为for-each)视为以下内容:

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

更多信息请参见: http://www.leepoint.net/notes-java/flow/loops/foreach.html

P.S:此方法适用于Java 5及以上版本。


如果你说“数组是可迭代的”是指数组实现了Iterable接口,那是错误的。 - trutheality
也许吧。很难说,因为像Eclipse这样的IDE在下划线问题时会进行编译。 - James P.
@trutheality:我的意思是,在解包后,数组将作为可迭代对象。不过我承认这只是一种假设,如果Java的处理方式有所不同,我很感兴趣听听。http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html - James P.
表达式必须具有Iterable类型,否则它必须是数组类型,否则将出现编译时错误。 - Michael Myers
@James P. 是我理解它如何工作的方式:如果第二个参数是一个数组,那么循环会被解释为 for(i=0;i<array.length;i++),如果第二个参数实现了 Iterable,则使用迭代器进行循环。自动拆箱是另一个功能,有时可以方便地与foreach结合使用,例如在 for (int n : list) 中,list 是一个 Iterable<Integer> - trutheality
这是正确的。根据提供的Iterable或数组,for循环在不同情况下工作方式不同。有关更多详细信息,请参见此问题:http://stackoverflow.com/questions/6216768/does-unboxing-apply-to-arrays 现在,这带来了一个问题,即数组如何表示,因为Javadoc中似乎没有Array类。 - James P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接