在Java中使用for-each循环

5
在我的代码中,
for(City city : country.getCities()){
   // do some operations
}

使用 country.getCities() 很耗费资源吗?JVM 会为每个调用维护堆栈跟踪吗..?

List<City> cityList = country.getCities();
for(City city : cityList){
   // do some operations
}

最佳使用方式是什么?

5个回答

9

不,这个循环:

for(City city : country.getCities())

只会调用country.getCities()一次,然后对其进行迭代。它不会在循环的每次迭代中调用它。在您的情况下,这相当于:

for (Iterator<City> iterator = country.getCities().iterator();
     iterator.hasNext(); ) {
    City city = iterator.next();
    // do some operations
}

按照你的第二个片段重新编写没有任何好处。

更多细节请参见JLS第14.14.2节


有一个好处,使用显式迭代器编写长版本可以让您执行iterator.remove()操作,而这是使用短版本无法实现的。 - benathon
@portforwardpodcast: 当然,但这就像说使用for循环和get更好,因为你得到了索引。在这里提供的代码上下文中,并没有任何益处。 - Jon Skeet

3

在这两种情况下,getCities()仅被调用一次。

默认声明:通常情况下,您不需要担心性能问题,因为编译器比人更擅长优化。


1

这两个是等价的。getCities()方法只会被执行一次。(如果你在该方法中加入System.out.println(),你应该能看到这一点)。

请注意,它不会多次调用getCities()方法,这不仅是为了性能考虑,而且因为不能保证每次返回相同的集合(可能直觉上认为它会返回相同的集合,但并没有强制要求)。

我更喜欢你的第一个例子,因为它更简洁。


0

两者是相同的,没有区别。而且country.getCities()将在循环中被调用一次。

我认为第一个更好,因为没有使用额外的引用。


0
JVM 在编译后会优化代码,以确保只调用一次 country.getCities() 方法。
应该以你和/或你的团队认为最易读的方式编写代码。

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