深入学习java集合:HashSet<E>实现

1、HashSet类图

           HashSet 是  Set  接口的典型实现,大多数时候使用  Set  集合时都使用这个实现类。 HashSet 按  Hash  算法 来存储集合中的元素,因此具有很好的存取和查找性能。 HashSet 具有以下特点:
                   –不能保证元素的排列顺序
                    –HashSet不是线程安全的
                    –集合元素可以使 null
        当向 HashSet集合中存入一个元素时,HashSet会调用该对象的 hashCode() 方法来得到该对象的 hashCode值,然后根据 hashCode值决定该对象在 HashSet中的存储位置。 如果两个元素的  equals()  方法返回  true ,但它们的  hashCode ()  返回值不相等, hashSet 将会把它们存储在不同的位置,但依然可以添加成功。 
          HashSet底层是通过引用HashMap来实现。默认初始化容量16,加载因子0.75。

2、HashSet构造实现以及重要方法
      对HashSet而言,其实现是依靠内部关联一个HashMap对象,对HashSet的操作都转为对这个HashMap对象响应对象的操作。添加到Set中的元素作为Map对象的key,,对应的value为一个公用的静态对象PRESENT  ,代码中为:
       private  transient HashMap<E,Object> map;
       // Dummy value to associate with an Object in the backing Map
        private static final Object PRESENT = new Object();
   1) 构造器
       HashSet 提供了5个不同的构造器。
  // 默认的无参构造器, 实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。  
        public HashSet() {
        map = new HashMap<>();
    }
  public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
 
//  构造一个包含指定collection中的元素的新set。 实际底层使用默认的加载因子0.75和足以包含指定 collection中所有元素的初始容量来创建一个    HashMap。 
  public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
// 以指定的initialCapacity和loadFactor构造一个空的HashSet。  
 public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
//以指定的initialCapacity构造一个空的HashSet。 
 public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
2)     iterator(): Iterator<E>  遍历Set的迭代器
 // 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。 
 // 层实际调用底层HashMap的keySet来返回所有的key,由此   可见HashSet中的元素,只是存放在了底层HashMap的key上。
 public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
3) contains(o: Object): boolean  判断Set中是否包含对应的元素
     //   如果此set包含指定元素,则返回true。   更确切地讲,当且仅当此set包含一个满足(o==null ? e==null : o.equals(e))   的e元素时,返回true。
 public boolean contains(Object o) {
        return map.containsKey(o);
    } 
4)  add(e: E): boolean  向Set中添加元素方法
 // 如果此set中尚未包含指定元素,则添加指定元素。  更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2))    的元素e2,则向此set 添加指定的元素e。    如果此set已包含该元素,则该调用不更改set并返回false。  
 public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

5) remove(o: Object): boolean  将元素从Set中移除的方法
 // 如果指定元素存在于此set中,则将其移除。  更确切地讲,如果此set包含一个满足(o==null ? e==null : o.equals(e))的元素e,    则将其移除。如果此set已包含该元素,则返回true   (或者:如果此set因调用而发生更改,则返回true)。(一旦调用返回,则此set不再包含该元素)。
 public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值