2014-09-05 15 views
5

Tôi đã thử nghiệm một số cách khác nhau để nhân các mục mảng với hằng số.Hành vi vòng lặp Java Array

Tôi đã tạo ra các kết quả khác nhau tùy thuộc vào cách tôi lặp qua mảng và tôi gặp khó khăn khi hiểu điều này (Tôi khá mới đối với Java và vẫn đang tìm hiểu cách mọi thứ được truyền hoặc tham chiếu).

Kiểm tra 1

int[] array = {1, 2, 3, 4}; 

for (int number : array) 
{ 
    number *= 2; 
} 

Hệ quả là mục mảng chưa sửa đổi:

{1, 2, 3, 4} 

Nó có vẻ như number không phải là mục mảng thực tế, nhưng một mới int được khởi tạo với giá trị của nó. Đúng không?


thử nghiệm 2

Tôi nghĩ rằng bằng cách sử dụng một loạt các đối tượng có thể làm việc, giả sử number là sau đó một tham chiếu đến mục mảng thực tế. Đây là thử nghiệm của tôi rằng việc sử dụng Integer thay vì int:

Integer[] array = {1, 2, 3, 4}; 

for (Integer number : array) 
{ 
    number *= 2; 
} 

Một lần nữa, kết quả là mục mảng chưa sửa đổi:

{1, 2, 3, 4} 

thử nghiệm 3

Sau khi một số người đứng đầu gãi tôi đã thử phương thức vòng lặp khác, như sau:

int[] array = {1, 2, 3, 4}; 

for (int i = 0; i < array.length; i ++) 
{ 
    array[i] *= 2; 
} 

Hệ quả là mục mảng nhân:

{2, 4, 6, 8} 

kết quả cuối cùng này có ý nghĩa với tôi, nhưng tôi không hiểu được những kết quả từ các thử nghiệm thứ hai (hoặc thứ nhất cho rằng vấn đề). Cho đến bây giờ, tôi đã luôn luôn giả định vòng lặp được sử dụng trong thử nghiệm 1 và 2 chỉ là một phiên bản viết tắt của vòng lặp được sử dụng trong thử nghiệm 3, nhưng chúng rõ ràng là khác nhau.

Tại sao tính năng này không hoạt động như tôi mong đợi? Tại sao các vòng lặp lại khác nhau?

+0

trong trường hợp thứ ba, bạn đang làm như mảng [0] = mảng [0] * 2; , tức là bạn đang thay thế mảng bằng các giá trị nhân mới. –

+0

Nói điều đó với tôi - Java là giá trị vượt qua. Java là giá trị theo từng giá trị. Java là giá trị theo từng giá trị. – csmckelvey

Trả lời

6

Điều này là do vòng lặp nâng cao for sử dụng bản sao của giá trị trong mảng. Các mã trong

for (int number : array) { 
    number *= 2; 
} 

là tương tự như:

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

Cùng xảy ra khi sử dụng Integer[].

Ngoài ra, khi bạn sử dụng vòng lặp nâng cao for trong một số Iterable ví dụ: List, nó sử dụng một trình lặp thay thế.Điều này có nghĩa, một mã như thế này:

List<Integer> intList = new ArrayList<>(); 
intList.add(1); 
intList.add(2); 
intList.add(3); 
intList.add(4); 
for(Integer i : intList) { 
    i *= 2; 
} 

là tương tự như:

for(Iterator<Integer> it = intList.iterator(); it.hasNext();) { 
    Integer i = it.next(); 
    i *= 2; 
} 

thông tin liên quan:

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