HashSet源码分析

HashSet源码分析

简介

HashSet不能存放重复的值,且不保证存放的顺序。

类结构

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

HashSet继承自AbstractSet并重写了方法

HashSet实现可Cloneable接口,可被克隆

HashSet实现了Serializable接口,可以被序列化

属性

//维护了一个HashMap,正是用这个HashMap来实现的去重
private transient HashMap<E,Object> map;

//用于HashMap存放时的value,节约空间
private static final Object PRESENT = new Object();

构造器

//无参构造器,初始化了HashMap
public HashSet() {
        map = new HashMap<>();
    }

//使用集合初始化的构造器
public HashSet(Collection<? extends E> c) {
  //使用集合的大小计算容量
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

//指定初始化大小和加载因子的构造器
public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

//指定初始化大小的构造器
public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

//同指定初始化大小和加载因子的构造器,第三个参数预留
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

方法

iterator()获取迭代器

public Iterator<E> iterator() {
  //使用的是HashMap的KeySet的迭代器
        return map.keySet().iterator();
    }

contains(Object)方法判断HashSet中是否已经包含该元素了

public boolean contains(Object o) {
  //直接调用HashMap的方法判断是否包含key
        return map.containsKey(o);
    }

add(E)方法添加元素

public boolean add(E e) {
  //把元素当做是key,value用预设的默认值,即用HashMap不能存放重复key的特性去重
        return map.put(e, PRESENT)==null;
    }

remove(Object)方法移除元素

public boolean remove(Object o) {
  //把HashMap中key对应的节点去除
        return map.remove(o)==PRESENT;
    }
上一篇:HashMap学习笔记(一)构造方法及重要属性


下一篇:带你从头看完java集合框架源码之Queue