2016-12-16 61 views
5

Everywhere trên StackOverflow, tôi thấy câu trả lời:Các bộ thực sự được triển khai dưới dạng bản đồ?

Một Set chỉ là một Map, ngoại trừ việc nó là Key là nó Value. Đây là lý do tại sao cả hai số SetMap không được trùng lặp vì vi phạm nguyên tắc Key duy nhất.

Nhưng sau đó tôi thấy (ví dụ) rằng Set không liên quan đến chính nó với tất cả Map. Infact, Map thậm chí không phải là một phần của Collections trong khi Set là. Nhưng với tôi, điều này không có ý nghĩa bởi vì rất có thể việc thực hiện HashSet trong JDK rất giống với việc thực hiện HashMap, bên cạnh thực tế là cả hai đều đến từ các giao diện khác nhau.

Mối quan hệ giữa SetMap về vấn đề này là gì?

enter image description here

+1

Nhìn vào mã nguồn chắc chắn sẽ giúp bạn. 'Set' thực sự được hỗ trợ bởi một số' Bản đồ ' – TheLostMind

+0

Ngoài ra, lưu ý rằng bạn không nên xem xét cách' HashSet' hoặc 'TreeSet' được triển khai và tự hỏi tại sao một lớp * được Bản đồ hỗ trợ nên được coi là Bộ sưu tập *. Việc triển khai có thể thay đổi, chức năng * của nó * cần được xem xét ở đây. – TheLostMind

+0

Bạn đã tìm thấy hình ảnh này ở đâu? Tôi có thể sử dụng không? Tôi đang làm một hướng dẫn về khung bộ sưu tập, và tôi thích ví dụ này. –

Trả lời

8

Các SetMap giao diện không liên quan (trừ các keySet()entrySet() phương pháp của giao diện Map rằng trở Set s hỗ trợ bởi Map).

Tuy nhiên, một số Set triển khai sử dụng thực hiện sự ủng hộ Map để lưu trữ dữ liệu của họ (các yếu tố của Set phím trở nên trong tiềm ẩn Map, và các giá trị của nền tảng Map chỉ là đối tượng dummy). Điều này đúng với HashSetTreeSet.

này được đề cập trong Javadoc: public class

HashSet
kéo dài AbstractSet
thực hiện Set, Cloneable, Serializable

Lớp này thực hiện các giao diện Set, được hỗ trợ bởi một bảng băm (thực sự là một cá thể HashMap).

And:

public class TreeSet
kéo dài AbstractSet
thực hiện NavigableSet, Cloneable, Serializable

Một NavigableSet thực hiện dựa trên một TreeMap.

2

Giao diện Cài đặt thực tế không được Bản đồ hoặc bất kỳ thứ gì hỗ trợ. Tuy nhiên, HashSet được thực hiện bằng cách sử dụng Hashmap như cấu trúc dữ liệu thực tế.

Set không được cho là có Bản đồ trong javadoc

Một bộ sưu tập mà không chứa các yếu tố trùng lặp. Chính thức hơn, các bộ không chứa cặp phần tử e1 và e2 sao cho e1.equals (e2) và nhiều nhất là một phần tử null. Như ngụ ý bởi tên của nó, giao diện này mô hình hóa trừu tượng thiết lập toán học.

Tuy nhiên, theo javadoc Hashset đang sử dụng HashMap liên tục để đảm bảo duy trì dữ liệu duy nhất.

Lớp này triển khai giao diện Set, được hỗ trợ bởi bảng băm (thực tế là bản sao HashMap). Nó không đảm bảo về thứ tự lặp của tập hợp; đặc biệt, nó không đảm bảo rằng thứ tự sẽ vẫn không đổi theo thời gian. Lớp này cho phép phần tử null.

Nó giữ giá trị được thêm vào Đặt bên trong Bản đồ dưới dạng khóa, không có giá trị. Nó thêm cùng một đối tượng đơn liên tục vào các giá trị cho tất cả các mục.

public boolean More ...add(E e) { 
    return map.put(e, PRESENT)==null; 
} 

Ở đây, PRESENT là đối tượng giả giá trị tĩnh được lưu giữ trong bản đồ chính.

private static final Object PRESENT = new Object(); 

Backing Bản đồ đối tượng được tạo ra khi chúng tôi gọi construtors hình HashSet: -

public More ...HashSet() { 
    map = new HashMap<E,Object>(); 
    } 

public Nhiều hơn ... HashSet (Collection c) { map = new HashMap (Math.max ((int) (c.size() /. 75f) + 1, 16)); addAll (c); }

công khai Thêm ... HashSet (int initialCapacity, float loadFactor) { map = new HashMap (initialCapacity, loadFactor); }

Tất cả các nguồn có thể được nhìn thấy ở đây link

Tham khảo javadocs cho việc triển khai Set khác được hỗ trợ bởi Map.

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