Bạn đúng rằng bạn chỉ cần duy trì một danh sách được liên kết đơn lẻ để theo dõi thứ tự chèn. Nhưng để duy trì hiệu quả một danh sách liên kết đơn lẻ, bạn thực sự cần danh sách được liên kết kép.
Hãy xem xét ba mục theo thứ tự
A ---> B ---> C
Giả sử bạn loại bỏ B
. Rõ ràng A
bây giờ sẽ trỏ đến C
. Nhưng trừ khi bạn biết mục nhập trước B
, bạn không thể nói hiệu quả mục nhập nào sẽ trỏ đến C
. Để khắc phục điều này, bạn cần mục nhập để trỏ theo cả hai hướng.
---> --->
A B C
<--- <---
Bằng cách này, khi bạn loại bỏ B
bạn chỉ có thể nhìn vào các mục trước và sau khi B
(A
và C
) và cập nhật để A
và C
điểm với nhau.
Lý do LinkedHashMap
duy trì thứ tự chèn trong khi HashMap
không, mặc dù thực tế là tất cả trừ 4 phương pháp được kế thừa, là nó được viết rất khéo léo. Hầu hết hoạt động triển khai cụ thể là thành viên của HashMap.Entry
, không phải là HashMap
. LinkedHashMap
có một lớp private static
LinkedHashMap.Entry
mở rộng static
lớp HashMap.Entry
của HashMap
. Ví dụ: khi bạn gọi put
hoặc remove
, mã cho LinkedHashMap
có thể giống như mã cho HashMap
vì chính các mục tự mình theo dõi thông tin trước và sau.Như một ví dụ, đây là mã đầy đủ cho LinkedHashMap.Entry.remove()
rằng tôi đã giải thích ở trên
private void remove() {
before.after = after;
after.before = before;
}
Nguồn
2015-01-13 07:09:33
Tôi không nghĩ rằng danh sách gấp đôi liên kết giúp đặt hàng, nó chỉ làm cho vượt qua danh sách dễ dàng hơn –
Nó không có traversal dễ dàng hơn. Nó chỉ đơn giản là làm cho loại bỏ các mục bản đồ hiệu quả hơn. –