Khác mục đích, nhưng dưới mui xe là cùng một thứ.
| HashSet<E> | HashMap<K,V> | |
|---|---|---|
| Implements | Set | Map |
| Lưu trữ | Phần tử duy nhất | Cặp key → value |
| Method | add, contains, remove | put, get, remove |
Sự thật: HashSet thực ra là wrapper của HashMap — value là dummy object dùng chung:
java
// HashSet rút gọn
public boolean add(E e) { return map.put(e, PRESENT) == null; }
public boolean contains(Object o) { return map.containsKey(o); }Khi dùng:
- "Có phần tử này không?" → HashSet.
- "Map key → giá trị" → HashMap.
java
Set<String> visited = new HashSet<>();
visited.add("java");
Map<String, Integer> count = new HashMap<>();
for (String w : words) count.merge(w, 1, Integer::sum);Yêu cầu chung: element/key phải override hashCode() + equals() đúng. record (Java 16+) tự sinh đúng cả hai → default cho key.
Different purpose, same internals.
| HashSet<E> | HashMap<K,V> | |
|---|---|---|
| Implements | Set | Map |
| Stores | Unique elements | Key → value pairs |
| Methods | add, contains, remove | put, get, remove |
Truth: HashSet is really a wrapper around HashMap — the value is a shared dummy object:
java
// HashSet (simplified)
public boolean add(E e) { return map.put(e, PRESENT) == null; }
public boolean contains(Object o) { return map.containsKey(o); }Which to use:
- "Is this present?" → HashSet.
- "Map key → associated value" → HashMap.
java
Set<String> visited = new HashSet<>();
visited.add("java");
Map<String, Integer> count = new HashMap<>();
for (String w : words) count.merge(w, 1, Integer::sum);Shared requirement: elements/keys must correctly override hashCode() + equals(). record (Java 16+) auto-generates both correctly → default for keys.