Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java for(Something s:Something.getList())_Java_Loops_For Loop - Fatal编程技术网

Java for(Something s:Something.getList())

Java for(Something s:Something.getList()),java,loops,for-loop,Java,Loops,For Loop,我有个简短的问题 我这样使用子句是否重要: for(Object obj : something.b.c.d.getList(){ ... } 还是这个 List list = something.b.c.d.getList(); for(Object obj : list){ ... } 我想知道其中一个是否比另一个快主要区别在于风格。语义基本相同。唯一显著的语义差异是,在第二个示例中,列表引用被命名,并且可以在循环内部和之后访问: List list = something.b.c.d.

我有个简短的问题 我这样使用子句是否重要:

for(Object obj : something.b.c.d.getList(){
...
}
还是这个

List list = something.b.c.d.getList();
for(Object obj : list){
...
}

我想知道其中一个是否比另一个快

主要区别在于风格。语义基本相同。唯一显著的语义差异是,在第二个示例中,列表引用被命名,并且可以在循环内部和之后访问:

List list = something.b.c.d.getList();
for(Object obj : list){
   if (list.contains(...)) { // inefficient, used purely as an illustration
      ...
   }
}
int n = list.size();
在第一个示例中,如果不再次评估
something.b.c.d.getList()
,则无法实现上述功能


如果您担心第一个示例反复计算
something.b.c.d.getList()
,那么情况肯定不是这样。您的两个示例都只对表达式求值一次。

性能可能没有差异,但总体性能取决于访问这些字段的成本(即从框架延迟加载)。访问字段只会发生一次,无论您选择用于此循环的样式如何

如果这两项都可以在增强型for语句中使用,那么这两种方法都是可以接受的


除非剖析器将代码的这一特定区域指定为故障点,否则我不会关心这样的优化。

我不同意这种说法。这些字段肯定只被访问一次?你可能是对的。我可能读得有点太快了。让我重新表述一下,我没有证据证明这一点,但对我来说,这只是一个同步过程,两种方法编译成相同的代码,即:
Iterator it=list.Iterator();而(it.hasNext()){…}
@Dici:没错。我不得不重新阅读JLS以进行复习,但是的,它们基本上变成了相同的表达方式。@JonSkeet:这意味着什么?从我最初的陈述开始,我重新编写了我的问题。看起来您关心的是性能微观优化,但这样的代码表明您确实应该关心设计和类型安全:它使用原始列表而不是泛型列表,使用公共字段而不是访问器。