2009-02-22 31 views
11

Tôi lo sợ đây là một câu hỏi thực sự ngu ngốc, nhưng ở đây đi:clear() impl trong Java's LinkedList

Tại sao phương pháp rõ ràng trong thực thi mặc định LinkedList của Java bận tâm đi bộ danh sách và bỏ tất cả các nút? Tại sao không chỉ bỏ tiêu đề và để phần còn lại của danh sách được kết nối - GC sẽ lấy nó, đúng không?

Dưới đây là phương pháp:

/** 
* Removes all of the elements from this list. 
*/ 
public void clear() { 
    Entry<E> e = header.next; 
    while (e != header) { 
     Entry<E> next = e.next; 
     e.next = e.previous = null; 
     e.element = null; 
     e = next; 
    } 
    header.next = header.previous = header; 
    size = 0; 
modCount++; 
} 

Tại sao đi nó? Tại sao không chỉ bỏ qua đến header.next = header.previous = header;?

Hình ảnh tốt nhất tôi có thể giúp GC ...? Liên kết này http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 loại gợi ý rằng.

TIA ...

Trả lời

18

Phương pháp của họ đảm bảo rằng ngay cả khi mã khác vẫn giữ tham chiếu đến các nút cụ thể, các nút khác sẽ được GC'ed.

Nếu không, ngay cả một tham chiếu bên ngoài duy nhất cho một trong các nút sẽ ngăn toàn bộ chuỗi bị thu thập.

Ngoài ra, các hoạt động khác trong danh sách có thể đang diễn ra đồng thời (ví dụ: xem qua subList() hoặc Collections.unmodifiableList(), vòng lặp) và điều này đảm bảo rằng những thứ đó nhận thấy danh sách là "trống" ngay lập tức.

+0

Tôi đã hoàn toàn không đồng ý, nói rằng không có cách nào để mã bên ngoài tham chiếu đến LinkedList $ Entry ... nhưng gián tiếp thông qua LinkedList $ ListItr bạn chắc chắn có thể ... Cảm ơn và nắm bắt tốt! – overthink

+0

Điều gì sẽ giữ nút? Một Iterator hoặc subList, nhưng chúng sẽ không hợp lệ để không giữ lại. –

+0

@Tom: nếu bạn không làm điều này thì danh sách con và Iterator sẽ tiếp tục hoạt động, nhưng khung bộ sưu tập sẽ cố gắng thất bại (nhưng không đảm bảo được). –

2

IIRC, đây là một thay đổi được thực hiện trong JDK6 để hỗ trợ hiệu suất của các thuật toán GC (thế hệ) nhất định. Thông thường, các nút chính cũ hơn và các nút cũ hơn sẽ là một thế hệ cũ hơn một số nút khác. Các thế hệ trẻ sẽ được thu thập thường xuyên hơn, với kết quả là các nút nhỏ được sao chép trước khi nó được phát hiện ra rằng tất cả các nút đều là rác.

Vì vậy, đó là tối ưu hóa hiệu suất nhỏ. Tối ưu hóa hiệu suất bộ nhớ là một chút kỳ lạ trong đó thường nó không phải là mã mà gây ra vấn đề đó là dành thêm thời gian để thực hiện.

0

Tôi vừa mới suy đoán về vấn đề này trên blog phát triển trò chơi của mình. Cảm ơn câu trả lời. Tôi cho rằng phơi nhiễm nút là một khoản trợ cấp thiết kế đáng ngờ. Nó cũng là sơ sài mà các quan điểm thay thế trên danh sách (các trình vòng lặp và như vậy) sẽ phụ thuộc vào việc hủy liên kết nút thành không nhanh. Thay vì dựa vào hành vi phụ này, các khung nhìn phụ trong danh sách nên kiểm tra số lượng sửa đổi. Trong mọi trường hợp, tôi thấy tại sao họ bị mắc kẹt với nó bây giờ.

0

Mã nguồn của java.util.LinkedList tại http://developer.classpath.org/doc/java/util/LinkedList-source.html gợi ý rằng bạn chỉ có thể đặt phần tử đầu tiên và cuối cùng thành rỗng.

Tất nhiên nếu bạn có xu hướng bảo vệ quá mức, bạn có thể lặp lại toàn bộ sự việc. Cá nhân tôi nghĩ rằng đây có thể là một nhiệm vụ rất tốn kém nếu danh sách của bạn chứa hàng nghìn yếu tố.

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