您的位置:首页 > 编程语言 > Java开发

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

2016-05-27 21:32 751 查看
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;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: