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 )。

  1. private static final Object PRESENT = new Object();
  2. private transient HashMap<E,Object> map;
  3. public HashSet(){
  4. map =newHashMap<>();
  5. }
  6. public boolean add(E e){
  7. // 调用HashMap的put方法,将hashSet的值set到HashSet的键上
  8. return map.put(e, PRESENT)==null;
  9. }

3.HashSet与HashMap的区别

HashSet HashMap
实现了Set接口 实现了Map接口
仅存储对象 存储键值对
调用add()方法添加元素 调用put()方法添加元素
HashSet 使用成员对象来计算 hashcode 值,对 两个对象 来说 hashcode 可能相 同,所以 equals()方法用来判断对象的相等性, 如果两个对象不同的话,那 么返回 false HashMap使用键(Key)来计算Hashcode
HashMap获取对象相对HashSet较快,因为他是使用的唯一键获取对象