1.说一下HashSet的实现原理
HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为是一个Object对象PRESENT声明,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
2.HashSet如何检查重复?HashSet是如何保证数据不可重复的?
向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结 合equles 方法比较。
HashSet 中的add ()方法会使用HashMap 的put()方法。
HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。 所以不会重复( HashMap 比较key是否相等是先比较hashcode 再比较equals )。
private static final Object PRESENT = new Object();private transient HashMap<E,Object> map;public HashSet(){map =newHashMap<>();}public boolean add(E e){// 调用HashMap的put方法,将hashSet的值set到HashSet的键上return map.put(e, PRESENT)==null;}
3.HashSet与HashMap的区别
| HashSet | HashMap |
|---|---|
| 实现了Set接口 | 实现了Map接口 |
| 仅存储对象 | 存储键值对 |
| 调用add()方法添加元素 | 调用put()方法添加元素 |
| HashSet 使用成员对象来计算 hashcode 值,对 两个对象 来说 hashcode 可能相 同,所以 equals()方法用来判断对象的相等性, 如果两个对象不同的话,那 么返回 false | HashMap使用键(Key)来计算Hashcode |
| HashMap获取对象相对HashSet较快,因为他是使用的唯一键获取对象 |
