Khi nào sử dụng HashMap trên LinkedList hoặc ArrayList và ngược lại


82

Lý do tại sao chúng ta 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 các thao tác thêm, bớt, cũng không phân biệt số lượng phần tử.

Tôi đã truy cập vào nó và tìm thấy một số lý do, nhưng luôn có một giải pháp để sử dụng HashMap, với những ưu điểm vẫn còn tồn tại.


11
ListsMapslà hai cấu trúc dữ liệu hoàn toàn khác nhau, với các phép toán 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 mà cả hai đều là giải pháp chấp nhận được không?
Mark Peters

3
Rõ ràng bạn chưa bao giờ cần thiết để giữ một bộ điều theo một thứ tự đặc biệt ...
Brian Roach

52
Phản đối, tại sao? Tôi nghĩ đây là một câu hỏi thích hợp. Mặc dù cho thấy thiếu kiến ​​thức, nhưng câu hỏi SO không nên bị loại bỏ vì cho thấy thiếu kiến ​​thức. Trên 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.

Câu trả lời:


96

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 một tập hợp các cặp khóa / giá trị.

Mặc dù bạn có thể sử dụng bản đồ như một danh sách, nhưng có một số mặt trái của việc làm như vậy.

Duy trì thứ tự: - Một danh sách theo định nghĩa là có thứ tự. Bạn thêm các mục và sau đó bạn có thể lặp lại 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 HashMap, bạn không được đảm bảo sẽ truy xuất các mục theo đúng thứ tự mà bạn đã đặt chúng. Có các lớp con của HashMap như LinkedHashMap sẽ duy trì thứ tự, nhưng nói chung thứ tự không được đảm bảo với Bản đồ.

Ngữ nghĩa của Khóa / Giá trị: - Mục đích của bản đồ là lưu trữ các mục dựa trên một khóa có thể được sử dụng để lấy mục đó ở một điểm sau. Chức năng tương tự chỉ có thể đạt được với một danh sách trong trường hợp hạn chế khi khóa xảy ra 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 danh sách thông qua lớp Bộ sưu tập. Ví dụ ...

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

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

Hi vọng điêu nay co ich,


LinkedLists thường bị cho là không tốt vì các vấn đề về hiệu suất. Tôi thường xuyên sử dụng LinkedLists trên ArrayLists vì thứ tự phần tử. 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í là khóa?
Cesar Castro

33

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 khi bạn muốn liên kết khóa với một giá trị và Danh sách là một tập hợp có thứ tự.

Bản đồ là một giao diện trong Java Collection Framework và HashMap là một phần triển khai của giao diện Bản đồ. HashMap 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 nhập của HashMap không được sắp xếp theo thứ tự.

ArrayList và LinkedList là một triển khai của giao diện Danh sách. LinkedList cung cấp quyền truy cập tuần tự và thường hiệu quả hơn trong việc 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 kém hiệu quả hơn. ArrayList cung cấp quyền truy cập ngẫu nhiên và hiệu quả hơn trong việc truy cập các phần tử nhưng nhìn chung việc chèn và xóa các phần tử chậm hơn.


1

Tôi sẽ đưa ra đây một số ví dụ và tình huống thực tế khi sử dụng cái này hoặc cái khác, nó có thể giúp ích cho người khác:

Bản đồ băm

Khi bạn phải sử dụng bộ nhớ đệm trong ứng dụng của mình. Redis và membase là một số loại HashMap mở rộng. (Không quan trọng thứ tự của các phần tử, bạn cần truy cập đọc nhanh (O (1)) (một giá trị), sử dụng một phím).

LinkedList

Khi thứ tự quan trọng (chúng được sắp xếp theo thứ tự khi được thêm vào LinkedList), số phần tử không xác định (không lãng phí cấp phát bộ nhớ) và bạn yêu cầu thời gian chèn nhanh (O (1)). Một danh sách các mục việc cần làm có thể được liệt kê tuần tự khi chúng được thêm vào là một ví dụ điển hình.


0

Điểm yếu của ArrayList và LinkedList là khi lặp qua chúng, tùy thuộc vào thuật toán tìm kiếm, thời gian cần thiết để tìm một mục sẽ tăng theo kích thước của danh sách.

Cái hay của phép băm là mặc dù bạn hy sinh thêm chút thời gian để tìm kiếm phần tử, nhưng thời gian thực hiện không tăng theo kích thước của bản đồ. Điều này là do HashMap tìm thông tin bằng cách chuyển đổi phần tử bạn đang tìm kiếm, trực tiếp thành chỉ mục, vì vậy nó có thể thực hiện bước nhảy.

Câu chuyện ngắn ... LinkedList : Tiêu tốn nhiều bộ nhớ hơn ArrayList một chút, chi phí thấp cho việc chèn (thêm và xóa) ArrayList : Sử dụng bộ nhớ thấp, nhưng tương tự như LinkedList và mất thêm thời gian để tìm kiếm khi dung lượng lớn. HashMap : Có thể thực hiện bước nhảy đến giá trị, giúp thời gian tìm kiếm không đổi đối với bản đồ lớn. Tiêu tốn nhiều bộ nhớ hơn và mất nhiều thời gian hơn để tìm giá trị so với danh sách nhỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.