2013-01-03 63 views
5

Tôi muốn biết chi tiết cách Enhanced For Loop hoạt động trong Java (giả sử tôi hiểu cách sử dụng cơ bản của vòng lặp này và cách hoạt động chung) .Java Enhanced For Loop - Chỉnh sửa giá trị mảng gốc

Với đoạn mã sau:

String[] a = {"dog", "cat", "turtle"}; 

for (String s : a) { 
    out.println("String: " + s); 
    s = in.readLine("New String? "); 
} 

Nó không thực sự sửa đổi danh sách ban đầu 'a'. Tại sao không? Quản lý bộ nhớ hoạt động như thế nào? Không phải là 'một tham chiếu đến cùng một tế bào bộ nhớ của' a [i] '?

Tôi đọc trên tài liệu hướng dẫn tăng cường cho vòng không thể được sử dụng để loại bỏ các phần tử khỏi mảng ban đầu, điều đó có ý nghĩa. Có giống nhau cho việc sửa đổi các giá trị không?

Cảm ơn trước

+3

Chuỗi là bất biến .. http://stackoverflow.com/a/8798424/112500 – Shashi

+0

's' là một biến chứa tham chiếu đến phần tử của vùng chứa. –

Trả lời

10

không 's' có phải là một tham chiếu đến ô nhớ cùng của 'a [i]?

Ban đầu, có. Nhưng sau đó in.readLine tạo tham chiếu đến đối tượng Chuỗi mới, sau đó bạn sử dụng để ghi đè s. Nhưng chỉ s bị ghi đè, không phải chuỗi bên dưới, cũng như tham chiếu trong mảng.

+0

Cảm ơn rất nhiều, điều này thực sự hữu ích. Bây giờ đã rõ rồi. – jnardiello

+1

@Oliver, Bạn có nghĩa là tham chiếu s bắt đầu đề cập đến một số đối tượng chuỗi khác chứ không phải là [i] khi chúng ta s = new String ("X")? – Abhinav

+1

@Abhinav: Có .. –

4

s là biến cục bộ trỏ đến phiên bản String. Nó không được liên kết với a[i], chúng chỉ xảy ra có cùng giá trị ban đầu.

3

Bạn chỉ có thể viết

for (int i = 0; i < a.length; i++) { 
    out.println("String: " + a[i]); 
    a[i] = in.readLine("New String? "); 
} 

Bạn không thể sử dụng cho-mỗi vòng để thay đổi bộ sưu tập hoặc mảng gốc.

+0

Bạn đã làm rõ điểm cuối cùng vẫn bị mờ. Cảm ơn rất nhiều! – jnardiello

+1

Nếu bạn muốn xóa() hoặc thay đổi mục nhập cho Danh sách, bạn phải sử dụng Iterator một cách rõ ràng. –

1

Hãy suy nghĩ trong s như địa chỉ cho một đối tượng. Điều ở đây là s chỉ ra một giá trị nhất định của mảng khi sử dụng vòng lặp for. Khi bạn đánh giá lại s bên trong vòng lặp chỉ xảy ra rằng s chỉ ra một giá trị khác nhưng giá trị ban đầu của mảng không bị sửa đổi vì bạn chỉ thay đổi địa chỉ s đang trỏ đến.

String[] a = {"dog", "cat", "turtle"}; 

for (String s : a) { 
    //s --> "dog" 
    out.println("String: " + s); 
    s = in.readLine("New String? "); 
    //s --> the new string the user inputs 
} 
+1

Cảm ơn rất nhiều câu trả lời chi tiết. Những gì tôi đã mất là thực tế là readLine đang trả về một địa chỉ mới. – jnardiello

+0

Nếu câu hỏi của bạn được trả lời, vui lòng upvote và chấp nhận câu trả lời;) – Averroes

1

Đối với mỗi lần lặp String ban đầu tham chiếu đến đối tượng String tương ứng trong String a []. Nhưng sau đó nó được tham chiếu đến một đối tượng String khác được trả về bởi in.readLine().

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