2015-01-13 17 views
11

Vì không có giải thích nội bộ và hợp lý trong bất kỳ chuỗi nào. Xin vui lòng cho tôi lý do chính xác.lý do tại sao linkedhashmap duy trì danh sách liên kết kép để lặp lại

  1. cho thứ tự chèn đủ để duy trì với danh sách được liên kết đơn lẻ nhưng tại sao không?

  2. cách danh sách được liên kết kép tăng hiệu suất trong trường hợp này?

  3. tất cả các phương pháp được kế thừa từ phương thức hashmap xpt 4 thì trình lặp cho hashmap không duy trì thứ tự trong khi liên kếthồ sơ duy trì thứ tự?

+0

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 –

+0

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. –

Trả lời

1

Để duy trì Insertion tự có gấp đôi là LinkedList. Tại bất kỳ thời điểm nào bạn có thể di chuyển nút phía trước hoặc nút quay lại. Nhưng nếu bạn đang có LinkedList duy nhất nếu Pointer của bạn chuyển đến phần tử cuối cùng, bạn lại cần phải bắt đầu từ điểm ban đầu và bạn không thể di chuyển trên nút trước đó.

+2

Tôi không nghĩ gấp đôi danh sách liên kết giúp đỡ trật tự, nó chỉ làm cho vượt qua danh sách dễ dàng hơn –

+0

Nếu bạn thấy nội HashMap được dựa trên LinkedList. vì vậy nếu bạn đang có thông tin như nút nào được chèn vào trước hoặc sau đó thì đó chỉ đơn giản là một thứ tự. – Prashant

+0

Một danh sách liên kết đơn lẻ là đủ để duy trì một đơn đặt hàng. Đây không phải là giải thích đúng cho lý do tại sao họ đã sử dụng một danh sách liên kết gấp đôi trong bối cảnh này. –

3

Các LinkedHashMap về cơ bản duy trì hai con trỏ cho mỗi mục cụ thể là -: Before, After

như tên đề nghị cả các con trỏ được sử dụng cho các mục đích đặt hàng và được sử dụng để điều chỉnh các con trỏ trong trường hợp chèn hoặc xóa.

8

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 (AC) và cập nhật để AC đ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 staticLinkedHashMap.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; 
} 
0

LinkedHashMap thể được sử dụng để duy trì trật tự chèn và để duy trì trật tự truy cập. LinkedHashMap thừa hưởng chức năng tương tự của hashmap cho duy trì danh sách trong xô, vì vậy sử dụng tiếp theo tham khảo.

Đối với việc duy trì trật tự chèn họ đã sử dụng danh sách gấp đôi liên kết (sử dụng trướcsau tham khảo), nhưng điều đó có thể được thực hiện bằng cách sử dụng danh sách đơn lẻ liên kết. Đồng thời họ phải đạt được các chức năng để truy cập và ở chỗ họ cần di chuyển thường xuyên của nguyên tố này đến cùng và điều đó đòi hỏi phải xóa thường xuyên để xóa thường xuyên họ đã sử dụng danh sách gấp đôi được liên kết.

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