2013-01-10 23 views
14

Tôi hiểu rằng mới cho mỗi vòng lặp hoạt động với Iterable và mảng, nhưng tôi không biết những gì đi đằng sau hậu trường khi làm việc với mảng.Mảng nguyên thủy hoạt động như thế nào với mỗi vòng lặp trong Java?

Có ai có thể giúp tôi hiểu điều này không? Cảm ơn trước.

int[] number = new int[10]; 

for(int i: number) { 

} 
+0

BTW, nó sẽ giúp nếu bạn đã nhận xét tại sao các câu hỏi đã được xuống bình chọn. –

+0

upvoted, nếu tìm thấy nó thú vị, đặc biệt là nếu nó tương đương trên cơ sở mã byte cho một vòng lặp bình thường (hiệu quả). Nhưng không ai trả lời chính xác. – AlexWien

Trả lời

3

Trong mã của bạn, bạn phân bổ một mảng gồm 10 số nguyên trong bộ nhớ và nhận tham chiếu đến nó. Trong vòng lặp, bạn chỉ cần lặp qua tất cả các mục trong mảng, ban đầu sẽ là 0 cho tất cả các mục. Giá trị của mỗi mục sẽ được lưu trữ trong biến i được khai báo trong vòng lặp for của bạn khi bạn lặp lại các phần tử mảng.

12

Vòng lặp là tương đương với:

for(int j = 0; j < number.length; j++) { 
    int i = number[j]; 
    ... 
} 

trong đó j là một tài liệu tham khảo nội bộ được tạo ra mà không mâu thuẫn với định danh người dùng thông thường.

+0

Điều này có đúng với các loại tham chiếu không? Ví dụ.Java sẽ sử dụng nội bộ thực thi này trên một Object [], hoặc nó sẽ làm điều gì đó khác (như chuyển đổi nó thành một Iterable)? – Karakuri

+0

@Karakuri Tôi thậm chí không tuyên bố đây là cách nó thực sự được triển khai thực hiện cho các mảng nguyên thủy, chỉ là hành vi được yêu cầu là tương đương. Hành vi bắt buộc đối với 'Object []' cũng tương đương. –

1

Các đối với từng qua mảng thực chất là "đường" trên cấu trúc này:

for(int i = 0;i<number.length;i++) 
{ 
} 

tôi sẽ tưởng tượng này được cung cấp như là một cấu trúc của ngôn ngữ để mọi người có thể sử dụng tăng cường cho vòng lặp trên một cấu trúc đã được lặp lại theo cách cũ.

+0

Điều đó sẽ cho tôi các giá trị 0 đến độ dài-1. Nó nên lấy các giá trị của các phần tử mảng, tất cả 0 trong mã ví dụ. –

+1

@PatriciaShanahan không chính xác, không có mã bên trong niềng răng của tôi. Tôi đã giải thích các cấu trúc đã xảy ra phía sau đường – Woot4Moo

2

này tương đương với:

for(int x = 0; x < number.length; x++) { 
    int i = number[x]; 
} 
1

Đây là tương đương với:

final int len = number.length; 
for(int j = 0; j < len; j++) { 
    int i = number[j]; 
} 

Lưu ý rằng foreach sẽ không đánh giá .length trong mỗi vòng lặp. này có thể cũng được loại bỏ bởi JVM, nhưng đặc biệt là trong trường hợp của các bộ sưu tập, nơi một số người sử dụng

for(int j = 0; j < collection.size(); j++) { 

nó làm cho một sự khác biệt (nhỏ) để nhanh

int len = collection.size() 
for(int j = 0; j < len; j++) { 
+0

Cảm ơn, tôi đã không nhận thức được cho mỗi vòng lặp không đánh giá chiều dài mỗi lần. –

6

Một hơi muộn nhưng đây rồi.

Trình biên dịch biết nếu bạn đang sử dụng câu lệnh vòng lặp cho mỗi bộ sưu tập hoặc cho một mảng.

Nếu được sử dụng để thu thập, trình biên dịch dịch vòng lặp cho mỗi thành tương đương cho vòng lặp sử dụng Iterator.

Nếu được sử dụng cho một mảng, trình biên dịch dịch vòng lặp cho mỗi thành tương đương cho vòng lặp sử dụng biến chỉ mục.

Here is a description at oracle.com

0

IntStream.range (1,4) có thể được sử dụng, nếu sử dụng java 8.

+0

Cảm ơn !!!!!!!!!! –

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