2011-11-02 29 views
57

Lý do tại sao chúng tôi không thể luôn sử dụng HashMap, mặc dù nó hiệu quả hơn nhiều so với ArrayList hoặc LinkedList trong việc thêm, loại bỏ hoạt động, cũng không phụ thuộc vào số lượng các yếu tố.Khi nào sử dụng HashMap trên LinkedList hoặc ArrayList và ngược lại

Tôi googled nó và tìm thấy một số lý do, nhưng luôn luôn có một cách giải quyết để sử dụng HashMap, với lợi thế vẫn còn sống.

+11

'Lists' và' Maps' hai * hoàn toàn * cấu trúc dữ liệu khác nhau, với các hoạt động khác nhau và bất biến. Bạn có thể giải thích bối cảnh/yêu cầu mà bạn đang nghĩ đến nơi cả hai sẽ là giải pháp được chấp nhận? –

+3

Dường như bạn chưa bao giờ cần giữ một bộ thứ gì đó * theo một thứ tự cụ thể * ... –

+39

Downvote, tại sao? Tôi nghĩ đây là một câu hỏi thích hợp. Cho thấy thiếu kiến ​​thức mặc dù, nhưng trên SO câu hỏi không nên được downvoted cho thấy thiếu kiến ​​thức. Trong thực tế, một câu hỏi luôn là kết quả của việc thiếu kiến ​​thức. –

Trả lời

78

Danh sách đại diện cho thứ tự tuần tự của các phần tử. Bản đồ được sử dụng để đại diện cho tập hợp các cặp khóa/giá trị.

Trong khi bạn có thể sử dụng bản đồ làm danh sách, có một số nhược điểm nhất định khi làm như vậy.

Duy trì trật tự: - Danh sách theo định nghĩa được sắp xếp. Bạn thêm các mục và sau đó bạn có thể lặp lại thông qua danh sách theo thứ tự mà bạn đã chèn các mục. Khi bạn thêm các mục vào một HashMap, bạn không được bảo đảm lấy các mục theo thứ tự bạn đặt chúng vào. Có các lớp con của HashMap như LinkedHashMap sẽ duy trì thứ tự, nhưng theo thứ tự chung không được bảo đảm với Bản đồ.

Ngữ nghĩa khóa/giá trị: - Mục đích của bản đồ là lưu trữ các mục dựa trên khóa có thể được sử dụng để truy xuất mục sau này. Chức năng tương tự chỉ có thể đạt được với một danh sách trong trường hợp giới hạn trong đó khóa xuất hiện là vị trí trong danh sách.

Khả năng đọc mã Hãy xem xét các ví dụ sau.

// Adding to a List 
    list.add(myObject);   // adds to the end of the list 
    map.put(myKey, myObject); // sure, you can do this, but what is myKey? 
    map.put("1", myObject);  // you could use the position as a key but why? 

    // Iterating through the items 
    for (Object o : myList)   // nice and easy 
    for (Object o : myMap.values()) // more code and the order is not guaranteed 

chức năng Bộ sưu tập Một số chức năng tiện ích tuyệt vời có sẵn cho các danh sách thông qua các lớp Collections. Ví dụ ...

// Randomize the list 
    Collections.shuffle(myList); 

    // Sort the list 
    Collections.sort(myList, myComparator); 

Hope this helps,

+0

LinkedLists thường được cho là xấu vì vấn đề hiệu suất.Tôi thường xuyên sử dụng LinkedLists trên ArrayLists vì thứ tự phần tử. Nó sẽ tốt hơn (cho hiệu suất và bộ nhớ) nếu tôi sử dụng HashMaps với các vị trí như là chìa khóa? – Seza

28

Danh sách và Bản đồ là các cấu trúc dữ liệu khác nhau. Bản đồ được sử dụng cho thời điểm bạn muốn liên kết khóa với giá trị và Danh sách là bộ sưu tập được sắp xếp.

Bản đồ là một giao diện trong Khung thu thập Java và HashMap là một giao diện thực hiện của giao diện Bản đồ. HashMap có hiệu quả để định vị một giá trị dựa trên một khóa và chèn và xóa các giá trị dựa trên một khóa. Các mục của HashMap không được đặt hàng.

ArrayList và LinkedList là triển khai giao diện Danh sách. LinkedList cung cấp truy cập tuần tự và nói chung là hiệu quả hơn khi chèn và xóa các phần tử trong danh sách, tuy nhiên, việc truy cập các phần tử trong danh sách sẽ kém hiệu quả hơn. ArrayList cung cấp truy cập ngẫu nhiên và hiệu quả hơn khi truy cập các phần tử nhưng thường chậm hơn khi chèn và xóa các phần tử.

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