2013-07-31 38 views
9

Tôi đã tìm ra một vấn đề trong Mã của tôi. Đầu tiên các mã:Java cho vòng lặp theo giá trị hoặc tham chiếu

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String[] blablubb = { "a", "b", "c" }; 

     for(String s : blablubb) { 
      s = "over"; 
     } 
     printArray(blablubb); 


     for (int i = 0; i < blablubb.length; i++) { 
      blablubb[i] = "over"; 
     } 
     printArray(blablubb); 

    } 

    public static void printArray(String[] arr) { 
     for(String s : arr) { 
      System.out.println(s); 
     } 
    } 

} 

Đầu ra là:

a 
b 
c 
over 
over 
over 

tôi cho rằng các vòng đầu tiên cũng sẽ ghi đè lên các String trong mảng. Vì vậy, đầu ra sẽ kết thúc trong mọi trường hợp. Dường như nó tạo ra một bản sao của giá trị thay vì tạo một tham chiếu. Tôi chưa bao giờ nhận thức được điều này. Tôi có làm sai không? Thay vào đó, có tùy chọn để tạo tham chiếu không?

// Chỉnh sửa: Có vẻ như mọi người đều biết về điều đó ngoại trừ tôi. Tôi từ C nền và không chú ý đủ để các tài liệu tham khảo hạn đó là rất khác nhau để C. May mắn thay nó đã cho tôi chỉ 10 phút để con số này ra (thời gian này).

+3

http : //stackoverflow.com/questions/40480/is-java-pass-by-reference – assylias

Trả lời

16

này:

for (String s : blablubb) { 
    s = "over"; 
} 

là bằng này:

for (int i = 0; i < blablubb.length; i++) { 
    String s = blablubb[i]; 
    s = "over"; 
} 

này tạo ra một chuỗi tạm thời với một bản sao của giá trị từ mảng và bạn thay đổi chỉ là bản sao. Đó là lý do tại sao blablubb[] nội dung không bị ảnh hưởng.

Nếu bạn muốn thay đổi các giá trị trong mảng, chỉ cần sử dụng tùy chọn thứ hai của bạn:

for (int i = 0; i < blablubb.length; i++) {   
    blablubb[i] = "over"; 
} 

Và, bằng cách này, bạn có thể in một mảng với chỉ một dòng:

System.out.println(Arrays.toString(blablubb)); 
1

Vòng lặp cho mỗi lần không sửa đổi các đối tượng chứa trong Bộ sưu tập các đối tượng mà nó đang lặp lại. Nó vượt qua giá trị không phải là tham chiếu.

0
s = "over"; 

chỉ thay đổi tham chiếu của s chứ không thay đổi Chuỗi trong mảng.

blablubb[i] = "over"; 

thay đổi giá trị được lưu trữ tại địa điểm thứ i trong mảng

4

for(String s : blablubb) vòng lặp của bạn là tương đương với đoạn mã sau:

for(int i = 0; i < blablubb.length; i++) { 
    String s = blablubb[i]; 
    s = "over"; 
} 

Hy vọng rằng, từ đây bạn có thể thấy rằng tất cả các bạn đang làm được gán lại giá trị khác cho s mà không thay đổi blablubb[i]. Điều này giải thích đầu ra bạn nhìn thấy.

0
for(String s : StringArray) 
{ 
} 

là như

for(int i = 0; i < StringArray.length; i++) 
{ 
    String s = StringArray[i]; 
} 
0

Khi bạn muốn làm một tối ưu hóa ở mức độ thấp, biết làm thế nào, bạn phải nhìn vào bên trong mã Java và bên trong byte-code hoặc (biên soạn code)

for(String s : blablubb) { 
      s = "over"; 
} 

bằng với:

for (int i = 0; i < blablubb.length; i++) { 
    String s = blablubb[i];    
    s = "over"; 
} 

và đó là lý do tại sao đầu ra như thế nào.

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