java源码解读之HashSet------jdk 1.7
2017-04-13 09:41
399 查看
今天来看下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.构造器
//构造器内部都在操作HashMap public 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(); }
相关文章推荐
- java源码解读之ArrayList------jdk 1.7
- java源码解读之TreeMap------jdk 1.7
- java源码解读之LinkedHashMap------jdk 1.7
- java源码解读之HashMap------jdk 1.7
- java源码解读之LinkedList------jdk 1.7
- jdk1.8.0_45源码解读——HashSet的实现
- Java之LinkedList源码解读(JDK 1.8)
- JDK源码(1.7) -- java.util.Queue<E>
- JDK 1.7 java.io 源码学习之ByteArrayInputStream和ByteArrayOutputStream
- java jdk 中HashMap的源码解读
- JDK源码(1.7) -- java.util.AbstractCollection<E>
- Java--String源码解析(JDK1.7)
- JDK源码(1.7) -- java.util.ListIterator<E>
- JDK 1.7 java.io 源码学习之FileInputStream和FileOutputStream
- Java之LinkedList源码解读(JDK 1.8)
- JDK 1.7 java.io 源码学习之InputStream和OutputStream
- Java之ArrayList源码解读(JDK 1.8)
- HashSet的故事----Jdk源码解读
- HashSet的故事----Jdk源码解读
- JDK 1.7 java.io 源码学习之AutoCloseable接口和try-with-resources语法