2012-12-13 42 views
5

Trong mã của tôi,Sử dụng for-each vòng lặp trong java

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

Sử dụng country.getCities() là tốn kém? JVM sẽ duy trì stacktrace cho mọi cuộc gọi ..?

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

Cách tốt nhất để sử dụng là gì?

Trả lời

9

Không, vòng lặp này:

for(City city : country.getCities()) 

sẽ chỉ gọi country.getCities()lần, và sau đó lặp trên nó. Nó không gọi nó cho mỗi lần lặp của vòng lặp. Trong trường hợp của bạn, nó tương đương với:

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

Không có lợi ích khi viết lại theo đoạn thứ hai của bạn.

Xem section 14.14.2 of the JLS để biết thêm chi tiết.

+0

Có một lợi ích, viết phiên bản dài với trình lặp lặp rõ ràng cho phép bạn thực hiện iterator.remove() mà bạn không thể làm với phiên bản ngắn – portforwardpodcast

+0

@portforwardpodcast: Chắc chắn, nhưng điều đó giống như nói rằng tốt hơn nên sử dụng 'cho 'vòng lặp và' get' bởi vì sau đó bạn đã có chỉ mục. Trong bối cảnh của mã thực sự được cung cấp ở đây, không có lợi ích. –

3

Trong cả hai trường hợp, getCities() chỉ được gọi một lần.

Tuyên bố từ chối trách nhiệm mặc định: Như thường lệ, bạn hầu như không bao giờ cần phải lo lắng về hiệu suất, vì trình biên dịch tốt hơn nhiều so với một người.

1

Chúng tương đương nhau. getCities() sẽ chỉ được thực hiện sau khi. (nếu bạn dán System.out.println() vào phương pháp đó, bạn sẽ thấy điều này).

Lưu ý rằng nó sẽ không gọi getCities() nhiều lần không chỉ vì những lý do về hiệu suất, mà còn bởi vì có không đảm bảo rằng nó sẽ trở về bộ sưu tập giống nhau mỗi lần (nó có thể là trực quan mà nó trả về bộ sưu tập này, nhưng không bắt buộc)

Tôi muốn ví dụ đầu tiên của bạn về sự phù hợp.

0

Cả hai đều giống nhau, không có sự khác biệt. Và country.getCities() sẽ được gọi một lần trong vòng lặp.

Tôi nghĩ đầu tiên tốt hơn vì không có tham chiếu bổ sung nào được sử dụng.

0

JVM sẽ tối ưu hóa mã khi được biên dịch để đảm bảo phương thức country.getCities() được gọi một lần.

Bạn nên viết mã theo cách bạn và/hoặc nhóm của bạn nghĩ là dễ đọc nhất.

Các vấn đề liên quan