2015-10-21 19 views
5

Tôi thấy một số hành vi mà tôi hoàn toàn không thể hiểu được và đã tự hỏi liệu có ai đó sẽ tử tế để giải thích chính xác những gì đang xảy ra ở đây không. Đây là mã tôi hiện đang có.Tại sao tôi xóa một phần tử khỏi ArrayList sai?

public class MyClass { 

    ArrayList<String> myList = new ArrayList<String>(); 

    public MyClass() { 
     populate(); 
     removeData(myList); 
    } 

    private void populate() { 
     myList.add("Some data"); 
     myList.add("Some more data"); 
     myList.add("Even more data"); 
    } 

    private void removeData(ArrayList<String> list) { 
     ArrayList<String> temp = new ArrayList<String>(); 
     temp = list; 
     temp.remove("Some data"); 
    } 
} 

Bây giờ vì lý do nào đó, sau khi tôi chạy mã này, dữ liệu sẽ bị xóa khỏi ArrayList "myList". Tại sao điều này xảy ra mặc dù tôi chỉ phải loại bỏ dữ liệu từ một biến bên trong phương thức "removeData" chứ không phải từ trường "myList"?

+1

nhưng bạn đã gán 'temp = list' để cơ bản tham chiếu trỏ đến cùng một đối tượng – ochi

+0

tài liệu tham khảo, bạn cần phải đọc thêm về Java và hướng đối tượng lập trình hướng cơ bản –

+0

Bởi vì templist = mylist được gán tham chiếu của danh sách của tôi để templist.so bất cứ điều gì bạn làm trên templist sẽ ảnh hưởng đến danh sách của tôi. –

Trả lời

6
temp = list; 

Mặc dù bạn đang xóa bên trong phương thức, bạn vẫn trỏ đến một thành viên thể hiện, do đó nó có thể thấy các thay đổi.

Bạn cần phải tạo danh sách mới với các giá trị đó nếu bạn không muốn ảnh hưởng đến thành viên cá thể.

3

Thay đổi mã của bạn để:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); 
    temp.remove("Some data"); 
} 

và bạn sẽ nhận được hành vi mong muốn của bạn (mặc dù nó không thực sự có ý nghĩa nhiều). Chỉ định list đến temp không sao chép các mục trong danh sách, nhưng chỉ gán một tham chiếu đến cùng một vùng bộ nhớ.

1

Java hoạt động với tham chiếu, vì vậy khi bạn gán temp = list, cả hai biến được trỏ đến cùng một đối tượng. Thay vào đó, bạn muốn tạo một bản sao của list:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); // Make a copy 
    temp.remove("Some data"); 
} 
1
ArrayList<String> temp = new ArrayList<String>(); 
    temp = list; 

Trong dòng đầu tiên bạn đang tạo danh sách mới. Đến thời điểm đó, nó vẫn ổn. Nhưng trong dòng tiếp theo bạn đang giới thiệu list đến temp. Vì vậy, đối tượng trước đó mà temp đã giới thiệu sẽ được thu thập rác temp sẽ đề cập đến cùng một đối tượng đã được tạo ra Myclass constructor

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