你能够先百度一下 HashMap 和 HashSet 的区别,有很多答案,包含但不限于:
- HashMap 实现了 Map 接口,HashSet 实现了 Set 接口。
- HashMap 是保留 key/value 的汇合,HashSet 是保留对象的联合。
- HashMap 不容许反复的键,然而容许反复的值,HashSet 不容许反复的元素。
- HashMap 容许有一个键为空,多个值为空,HashSet 容许有一个空值。
- HashMap 中应用 put() 将元素退出 map 中,而 HashSet 应用 add() 将元素放入 set 中。
- HashSet 较 HashMap 来说比较慢。
可能还有其余的 ……
以上 1~5 应该是对的,第 6 条不晓得是怎么得出的,必定不对。
你如果就是想晓得一下他们的区别,记得百度之后甄别一下对错,挑选出正确的记下就是了。
然而我倡议你记住以下一条就对了:
HashSet 底层其实就是 HashMap,HashSet 除了封装之后裸露进去的办法和 HashMap 不同之外(比方 add 办法和 put 办法的区别),其实没有什么鸟区别!
不信你就看看 HashSet 源码:
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {map = new HashMap<>();
}
认真看一眼(说错了,简略看一眼),你就会发现:
- HashSet 数据其实存储在成员变量 map 中,map 就是个 HashMap。
- HashSet 蕴含了一个叫 dummy value 的 object 对象,创立 HashSet 的时候为每一个 key 匹配这个 dummy object 生成 HashMap, 所以说白了,你能够了解为:HashSet 其实就是为所有 key 值都默认匹配一个空的 Object 对象的 HashMap。
- HashSet 的 add 办法,调用的是 HashMap 的 put 办法。
- 不止,Hashset 的 contains()、size()、isEmpty()、iterator()… 等等一众办法,调用的都是 HashMap 对应的办法。
所以你说他们两个有什么区别?从底层数据结构的角度看,他们其实就是同一头驴子,在不同的场合给他一个不同的披挂,拉进去遛而已。只不过在某些场合他的某些性能被限度了不让用,而已。
所以,其实咱们能够这么对待 HashSet:
- HashSet 底层就是 HashMap。这一点很重要,咱们就不再须要剖析 Hashset 的底层数据结构了。
- HashSet 只容许存储元素而不容许存储键值对。
- HashSet 能够通过 add 减少元素,通过 contains 判断元素是否存在。
- 因为 HashMap 不容许反复的键,所以能够得出,HashSet 不容许存储反复的元素。
- Hashset 容许存储惟一的一个 Null 对象。
不啰嗦了,HashSet 的简直所有个性都能够由 HashMap 推导进去。
此外,省点力量:LinkedHashSet 对应 LinkedHashMap,TreeSet 对应 TreeMap。
能够睡觉了 …