2009-05-05 48 views
5

Tôi đã xem qua tài liệu Java và tôi đã xem xét phương thức clear() của ArrayLists.Tính hữu ích của ArrayList <E> .clear()?

Việc sử dụng điều này là gì, trái ngược với việc chỉ định lại đối tượng ArrayList mới cho biến đó?

+0

Lưu ý rằng phương thức clear() được xác định bởi Collection. Nó cũng có mặt trong giao diện Bản đồ. –

Trả lời

14

Vì có thể có nhiều tham chiếu đến một danh sách, nên có thể thích hợp và/hoặc thực tế hơn để xóa nó hơn gán lại tất cả các tham chiếu.

Nếu bạn làm trống mảng của mình rất nhiều (trong vòng một vòng lặp lớn), không có điểm nào tạo ra nhiều đối tượng tạm thời. Chắc chắn các nhà sưu tập rác cuối cùng sẽ làm sạch chúng lên nhưng không có điểm nào lãng phí với các nguồn lực nếu bạn không phải.

Và vì việc xóa danh sách ít hoạt động hơn là tạo một danh sách mới.

+3

Thực ra, có những trường hợp tái sử dụng bộ sưu tập có thể gây ra vấn đề về bộ nhớ. Một thời gian ngắn, nếu một ArrayList lớn (hoặc tương tự) được lưu giữ trong một thời gian dài, nó sẽ được quảng bá cho thế hệ được thuê. Sau đó, bất kỳ phần tử nào chứa trong đó có thể là rác trong thế hệ trẻ không thể được thu thập mà không có một thế hệ đầy đủ (phân tích thế hệ được thuê và có thể thấy rằng các phần tử thực sự là rác). – erickson

1

clear() không phân bổ lại đối tượng mới, do đó, nó ít bị ảnh hưởng hơn.

2

Hãy tưởng tượng tình huống có nhiều tham chiếu của cùng một số java.util.ArrayList trong suốt mã của bạn. Nó sẽ là gần như không thể hoặc rất khó để tạo ra trường hợp mới của danh sách và gán cho tất cả các biến. Nhưng java.util.ArrayList.clear() thực hiện thủ thuật!

3

Bạn có thể có một lĩnh vực thức (biến lớp) List:

private final List<Thing> things = ... 

Một nơi nào đó trong lớp bạn muốn xóa (loại bỏ tất cả) mọi thứ. Kể từ khi things là cuối cùng nó không thể được giao lại. Hơn nữa, có thể bạn không muốn gán lại một thể hiện List mới vì bạn đã có một danh sách hoàn hảo tốt.

2

Bạn trả ít hơn với mức độ rõ ràng hơn là bạn tạo ra một đối tượng mới nếu mục tiêu của bạn thực sự rõ ràng.

Chỉ định lại tham chiếu không xóa đối tượng. Giả định là nếu không có tham chiếu khác cho nó, nó sẽ được khai hoang bởi GC tương đối sớm. Nếu không, bạn chỉ có một mớ hỗn độn.

2

Ngoài những lý do được đề cập, việc xóa danh sách thường chính xác hơn về mặt ngữ nghĩa so với việc tạo danh sách mới. Nếu kết quả mong muốn của bạn là một danh sách bị xóa, hành động bạn nên thực hiện là xóa danh sách, không tạo danh sách mới.

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