在java中使用for-each循环

时间:2012-12-13 10:32:21

标签: java

在我的代码中,

for(City city : country.getCities()){
   // do some operations
}

使用country.getCities()是否代价高昂? JVM是否会为每次调用维护堆栈跟踪..?

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

最好的使用方法是什么?

5 个答案:

答案 0 :(得分:9)

不,这个循环:

for(City city : country.getCities())

只会调用country.getCities() 一次,然后迭代它。它不会为循环的每次迭代调用它。在你的情况下,它相当于:

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

根据你的第二个片段重写它没有任何好处。

有关详细信息,请参阅section 14.14.2 of the JLS

答案 1 :(得分:3)

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

默认免责声明:一如既往,您几乎不需要担心性能,因为编译器比一个人要好得多。

答案 2 :(得分:1)

这些是等效的。 getCities()只会执行一次。 (如果您在该方法中粘贴System.out.println(),您应该看到这一点。)

请注意,它不会多次调用getCities(),不仅仅是出于性能原因,还因为无法保证每次都会返回相同的集合(可能是直观的,它返回相同的集合,但没有强制要求)

我更希望你的第一个例子是简洁。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

JVM会在编译时优化代码,以确保调用country.getCities()方法一次。

您应该按照您和/或您的团队认为最具可读性的方式编写代码。