HashSet剖析

对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable   
{   
     // 使用 HashMap 的 key 保存 HashSet 中所有元素  
     private transient HashMap<E,Object> map;   
     // 定义一个虚拟的 Object 对象作为 HashMap 的 value   
     private static final Object PRESENT = new Object();   
     ...   
     // 初始化 HashSet,底层会初始化一个 HashMap   
     public HashSet()   
     {   
          map = new HashMap<E,Object>();   
     }   
     // 以指定的 initialCapacity、loadFactor 创建 HashSet   
     // 其实就是以相应的参数创建 HashMap   
     public HashSet(int initialCapacity, float loadFactor)   
     {   
          map = new HashMap<E,Object>(initialCapacity, loadFactor);   
     }   
     public HashSet(int initialCapacity)   
     {   
          map = new HashMap<E,Object>(initialCapacity);   
     }   
     HashSet(int initialCapacity, float loadFactor, boolean dummy)   
     {   
          map = new LinkedHashMap<E,Object>(initialCapacity,loadFactor);   
     }   
     // 调用 map 的 keySet 来返回所有的 key   
     public Iterator<E> iterator()   
     {   
          return map.keySet().iterator();   
     }   
     // 调用 HashMap 的 size() 方法返回 Entry 的数量,就得到该 Set 里元素的个数  
     public int size()   
     {   
          return map.size();   
     }   
     // 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空,  
     // 当 HashMap 为空时,对应的 HashSet 也为空  
     public boolean isEmpty()   
     {   
          return map.isEmpty();   
     }   
     // 调用 HashMap 的 containsKey 判断是否包含指定 key   
     //HashSet 的所有元素就是通过 HashMap 的 key 来保存的  
     public boolean contains(Object o)   
     {   
          return map.containsKey(o);   
     }   
     // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入 HashMap   
     public boolean add(E e)   
     {   
          return map.put(e, PRESENT) == null;   
     }   
     // 调用 HashMap 的 remove 方法删除指定 Entry,也就删除了 HashSet 中对应的元素  
     public boolean remove(Object o)   
     {   
          return map.remove(o)==PRESENT;   
     }   
     // 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素  
     public void clear()   
     {   
          map.clear();   
     }   
     ...   
}  

由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
我们知道HashMap有一个特点就是,它的key是不允许重复的,所以HashSet将它的value作为HashMap的key进行保存,正好实现了HashSet插入值不可重复的特性。

另外这里要注意了:
将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能真正确保set中没有储存相等的对象。具体原因可以参看:
HashMap剖析
Java equals和HashCode方法总结

引用:
java中HashSet详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值