java.util.HashSet源码解析

来源:互联网 发布:魔兽世界1.12数据库 编辑:程序博客网 时间:2024/05/17 01:35

1.java集合框架图


2.所属包

package java.util;

3.继承与实现关系

public class HashSet<E>    extends AbstractSet<E>    implements Set<E>, Cloneable, java.io.Serializable

4.准备工作

类HashSet实际上是操作一个HashMap的实例,不保证集合的迭代顺序,也不保证该顺序恒久不变,该类允许使用null元素。建议先看HashMap的源码解析 :          java集合之HashMap源码解析

5.属性

//由哈希表(实际上是一个 HashMap 实例)支持。    private transient HashMap<E,Object> map;    /*由于HashSet是对单值操作,而HashMap采用的是键值对的形式,由于HashSet的元素值作为了HashMap的键,那么对应的值就都是PRESENT。 *满足HashMap结构*/     private static final Object PRESENT = new Object();

6.构造方法

/** 构造方法1:     * 构造一个初始化容量为16,加载因子为0.75的HashMap     */    public HashSet() {        map = new HashMap<>();    }
 /** 构造方法2:     * 采用HashMap的集合参数为构造方法的参数的方式     */    public HashSet(Collection<? extends E> c) {        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));        addAll(c);    }public boolean addAll(Collection<? extends E> c) {        boolean modified = false;        for (E e : c)            if (add(e))                modified = true;        return modified;    }
/** 构造方法3:     * 输入一个初始化容量和加载因子的构造方法HashMap     */    public HashSet(int initialCapacity, float loadFactor) {        map = new HashMap<>(initialCapacity, loadFactor);    }
 /** 构造方法4:     * 输入初始化容量的构造方法HashMap     */    public HashSet(int initialCapacity) {        map = new HashMap<>(initialCapacity);    }

7.方法

add方法:

/**     * 采用HashMap的put方法,如果添加的元素已经存在于HashMap中,那么就返回true,否则返回false     */    public boolean add(E e) {        return map.put(e, PRESENT)==null;    }

remove方法:

/**     * 采用HashMap中的remove方法,在HashMap中删除键对应的值就返回对应的Entry元素的值,将值与存入的PRESENT值比较。 * 如果值相同就删除成功,否则失败     */    public boolean remove(Object o) {        return map.remove(o)==PRESENT;    }



-----------------------------该源码为jdk1.7版本的