在我的代码中,
for(City city : country.getCities()){
// do some operations
}
使用country.getCities()是否代价高昂? JVM是否会为每次调用维护堆栈跟踪..?
List<City> cityList = country.getCities();
for(City city : cityList){
// do some operations
}
最好的使用方法是什么?
答案 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()
方法一次。
您应该按照您和/或您的团队认为最具可读性的方式编写代码。