2011-09-08 27 views
11
public class TestingArray { 

    public static void main(String[] args) { 

     int iCheck = 10; 
     int j = iCheck; 
     j = 11; 
     System.err.println("value of iCheck "+iCheck); 

     int[] val1 = {1,2,9,4,5,6,7}; 
     int[] val2 = val1; 
     val2[0] = 200; 
     System.err.println("Array Value "+val1[0]); 
    } 

} 

Output:vấn đề với giao một mảng vào mảng khác trong java

giá trị của iCheck 10
mảng giá trị 200

Từ đoạn code trên tôi thấy rằng nếu có mảng val2 đang được gán cho một mảng val1 khác và nếu chúng ta thay đổi bất kỳ giá trị nào của mảng val2, kết quả cũng được phản ánh cho mảng val1 trong khi kịch bản tương tự không phải là với phép gán biến. Tại sao?

Trả lời

21

Tuyên bố sau đây làm cho val2 tham khảo các mảng giống như val1:

int[] val2 = val1; 

Nếu bạn muốn tạo một bản sao, bạn có thể sử dụng val1.clone() hoặc Arrays.copyOf():

int[] val2 = Arrays.copyOf(val1, val1.length); 

Đối tượng (kể cả trường hợp các lớp sưu tập, String, Integer v.v.) hoạt động theo cách tương tự, trong đó gán một biến cho một biến khác đơn giản là sao chép tham chiếu, làm cho cả hai các biến tham chiếu đến cùng một đối tượng. Nếu đối tượng được đề cập là có thể thay đổi, thì các sửa đổi tiếp theo được thực hiện cho nội dung của nó thông qua một trong các biến cũng sẽ hiển thị thông qua các biến khác.

Loại nguyên thủy (int, double vv) hoạt động khác nhau: không có tham chiếu nào có liên quan và gán sẽ tạo bản sao giá trị.

+1

+1: Hoặc sử dụng 'int [] val2 = val1.clone();' –

3

Đơn giản chỉ cần đặt "val1" và "val2" là con trỏ tới mảng thực. Bạn đang gán val2 để trỏ đến cùng mảng với val1. Vì vậy, thay đổi một, và người kia thấy cùng một sự thay đổi. Để có nó thực sự là một bản sao, bạn phải sao chép mảng thay vì gán.

1

Vì bạn chỉ định tham chiếu val1 đến val2 nên cả hai đều trỏ đến cùng một đối tượng trong bộ nhớ.

1

Vì mảng trong Java là các đối tượng, tức là được chuyển qua tham chiếu.

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