2010-03-14 61 views
124

Tôi bắt đầu học Java. Khi nào tôi sẽ sử dụng HashMap trên TreeMap?Sự khác biệt giữa HashMap và TreeMap là gì?

+22

Stackoverflow không chỉ dành cho người hỏi câu hỏi mà còn cho những người khác tìm kiếm câu trả lời. Vì vậy, nó là hoàn toàn tốt cho tôi nếu tôi tìm thấy một câu trả lời ở đây cũng được chứa trong một số cuốn sách tôi không có ... –

Trả lời

195

TreeMap là ví dụ về SortedMap, có nghĩa là thứ tự của các khóa có thể được sắp xếp và khi lặp qua các khóa, bạn có thể mong đợi chúng sẽ theo thứ tự. Mặt khác,

HashMap không đảm bảo như vậy. Do đó, khi lặp qua các khóa của một số HashMap, bạn không thể chắc chắn thứ tự của chúng.

HashMap sẽ hiệu quả hơn nói chung, vì vậy hãy sử dụng nó bất cứ khi nào bạn không quan tâm đến thứ tự của phím.

+116

'HashMap' là hiệu quả hơn thời gian. 'TreeMap' có hiệu quả về mặt không gian hơn. – erickson

+30

TreeMap chỉ hoạt động với các đối tượng Comparable, HashMap chỉ hoạt động với các đối tượng có thực thi hashCode() phù hợp. – Thilo

+11

@erickson: bạn có thể đăng tham chiếu/liên kết để sao lưu câu lệnh này không? –

20

Sử dụng HashMap hầu hết các lần nhưng sử dụng TreeMap khi bạn cần khóa cần sắp xếp (khi bạn cần lặp lại khóa).

7

Bạn hầu như luôn sử dụng HashMap, bạn chỉ nên sử dụng TreeMap nếu bạn cần khóa của mình theo thứ tự cụ thể.

7

HashMap được sử dụng để tra cứu nhanh, trong khi TreeMap được sử dụng cho các lần lặp được sắp xếp trên bản đồ.

29

Tóm lại:

  • HashMap: Cơ cấu Lookup-mảng, dựa trên hashCode(), tương đương với() triển khai, O (1) thời gian chạy phức tạp cho chèn và tìm kiếm, không được phân loại
  • TreeMap: Cây cơ cấu, dựa trên compareTo() thực hiện, O (log (N)) runtime phức tạp cho chèn và tìm kiếm, sắp xếp

Trích từ: HashMap vs. TreeMap

+2

Độ phức tạp o HashMap là O (1 + a). Phụ thuộc vào hàm hashCode "a" có thể đạt tới "n" trong trường hợp xấu nhất. – 30thh

5

Alo Với một cửa sổ khóa được sắp xếp, một khác biệt khác là với TreeMap, nhà phát triển có thể cung cấp (String.CASE_INSENSITIVE_ORDER) với các khóa String, do đó, trình so sánh bỏ qua trường hợp khóa khi thực hiện so sánh các phím trên truy cập bản đồ. Điều này là không thể đưa ra tùy chọn như vậy với HashMap - nó luôn luôn là trường hợp so sánh nhạy cảm trong HashMap.

+1

Không cần thiết. Nếu bạn thực sự muốn điều này, bạn có thể đơn giản làm cho một trang trí cho một bản đồ, mà cho tất cả mọi thứ liên quan đến đầu vào quan trọng, bạn làm cho nó tất cả các trường hợp trên/dưới, và ủy quyền cho bản đồ trang trí. Bằng cách đó, không khó để có một hashmap "phân biệt chữ hoa chữ thường". Dù sao, câu trả lời này có lẽ là một chút off-topic: bạn chỉ nói về một trường hợp sử dụng rất cụ thể của treemap, mà tôi không thấy nó rất có ý nghĩa như một so sánh giữa hashmap/treemap –

14

Tôi sẽ nói chuyện về HashMapTreeMap thực hiện trong Java:

  • HashMap - thực hiện giao diện bản đồ cơ bản

    1. thực hiện bởi một loạt các xô, mỗi thùng là một LinkedList của các mục nhập
    2. thời gian chạy của các phép toán cơ bản: put(), trung bình O (1), trường hợp xấu nhất O (n), xảy ra khi bảng là r được tiến hành; get(), remove(), trung bình O (1)
    3. không được đồng bộ hóa, để đồng bộ hóa nó: Map m = Collections.synchronizedMap(new HashMap(...));
    4. Thứ tự lặp lại của bản đồ là không thể đoán trước.
  • TreeMap - thực hiện điều hướng giao diện bản đồ

    1. thực hiện bởi một cây đỏ-đen
    2. thời điểm thao tác cơ bản chạy: put(), get(), remove(), trường hợp xấu nhất O (lgn)
    3. không được đồng bộ hóa, để đồng bộ hóa: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
    4. cung cấp lặp lại theo thứ tự. phím cao hơn(), lowerKey() có thể được sử dụng để có được người thừa kế và người tiền nhiệm của một khóa đã cho.

Tổng hợp, sự khác biệt lớn nhất giữa HashMap và TreeMap là TreeMap mà thực hiện NavigableMap<K,V>, trong đó cung cấp các tính năng của lặp đặt hàng. Bên cạnh đó, cả HashMap và TreeMap đều là thành viên của khung công tác Bộ sưu tập Java. Bạn có thể điều tra source code of Java để biết thêm về triển khai của chúng.

50

HashMap được triển khai bởi Bảng băm trong khi TreeMap được triển khai bởi Red-Black tree. Sự khác biệt chính giữa HashMapTreeMap thực sự phản ánh sự khác biệt chính giữa HashBinary Tree, nghĩa là khi lặp lại, bảo đảm TreeMap có thể thứ tự khóa được xác định bằng phương thức compareTo() của phần tử hoặc bộ so sánh được đặt trong hàm tạo TreeMap.

Hãy xem following diagram.

enter image description here

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