java源码解读之HashSet------jdk 1.7

来源:互联网 发布:付费网络推广 编辑:程序博客网 时间:2024/05/21 09:58
今天来看下HashSet,跟LinkedHashMap一样跟HashMap关系很大,不同的是HashSet不是继承HashMap,而是把HashMap作为一个属性使用。相当于只是使用HashMap的key,所以方法都是围绕操作HashMap来进行。HashSet的内部结构很简单,下面就简单的说明一下。1. 定义

首先来看看set的接口定义:

//跟list与map接口方法名字左右大抵一致,就不多做介绍了public interface Set<E> extends Collection<E> {    // Query Operations    int size();    boolean isEmpty();    boolean contains(Object o);    Iterator<E> iterator();    Object[] toArray();    <T> T[] toArray(T[] a);    // Modification Operations    boolean add(E e);    boolean remove(Object o);    // Bulk Operations    boolean containsAll(Collection<?> c);    boolean addAll(Collection<? extends E> c);    boolean retainAll(Collection<?> c);    boolean removeAll(Collection<?> c);    void clear();    // Comparison and hashing    boolean equals(Object o);    int hashCode();}

现在来看看HashSet的定义:

//AbstractSet实现了set的一部分方法的一个抽象类public class HashSet<E>    extends AbstractSet<E>    implements Set<E>, Cloneable, java.io.Serializable
2. 属性
//不是使用数组什么的,底层是使用HashMap作为实现private transient HashMap<E,Object> map;//因为HashMap存放需要value,所以设置一个静态变量作为值进行存储private static final Object PRESENT = new Object();
3.构造器
//构造器内部都在操作HashMappublic HashSet() {    map = new HashMap<>();}public HashSet(Collection<? extends E> c) {    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));    //数据放置在HashMap中,具体代码看下方    addAll(c);}public boolean addAll(Collection<? extends E> c) {    //modified如果为true说明put方法调用成功,HashMap中没有重复值    boolean modified = false;    for (E e : c)        if (add(e))            modified = true;    return modified;}public boolean add(E e) {    return map.put(e, PRESENT)==null;}public HashSet(int initialCapacity, float loadFactor) {    map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {    map = new HashMap<>(initialCapacity);}//引用自网上:不对外公开的一个构造方法(默认default修饰),底层构造的是LinkedHashMap,dummy只是一个标示参数,无具体意义HashSet(int initialCapacity, float loadFactor, boolean dummy) {    map = new LinkedHashMap<>(initialCapacity, loadFactor);}
4.解析部分方法源码4.1 增加方法
//上面已经介绍过,就是调用HashMap的put方法,没什么好说的public boolean add(E e) {    return map.put(e, PRESENT)==null;}
4.2 增加方法
//就是调用HashMap的remove方法,没什么好说的public boolean remove(Object o) {   return map.remove(o)==PRESENT;}
4.3 修改方法因为set的特性,无重复,所以不需要修改方法,如果不需要直接调用删除方法。4.4 查找方法因为Set的特性,无序,没有提供get方法4.5 迭代器
//还是调用HashMap中key的迭代器来实现方法public Iterator<E> iterator() {    return map.keySet().iterator();}
0 0
原创粉丝点击