Java集合源码:(六) HashSet源码解析(JDK8)

HashSet概述

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,其实看过了HashMap源码的同学,就会发现HashSet的实现好简单,如果没有看过关于HashMap的源码解析的,可以看我的另一篇博客:


HashSet特点

  • 非线程安全
  • 允许null值
  • 添加值得时候会先获取对象的hashCode方法,如果hashCode 方法返回的值一致,则再调用equals方法判断是否一致,如果不一致才add元素。

注意: 对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。

HashSet源码

hashset就一个重要的成员变量:

// 真正实现存储功能的map , HashSet的值就是存到HashMap的key中,所以不可重复

private transient HashMap<E,Object> map;

// HashMap的value, 一个虚拟值,无用

private static final Object PRESENT = new Object();



//构造函数

public HashSet() {

        map = new HashMap<>();

}

add源码:

    public boolean add(E e) {

        return map.put(e, PRESENT)==null;

    }

将元素存到内部HashMap的key中,而值就是一个空的Object对象。所以HashSet特点是不可重复。

remove源码:

    public boolean remove(Object o) {

        return map.remove(o)==PRESENT;

    }

同add方法,不必讲。类似的还有下面:

    public Iterator<E> iterator() {

        return map.keySet().iterator();

    }



    public int size() {

        return map.size();

    }



    public boolean isEmpty() {

        return map.isEmpty();

    }

支付宝打赏 微信打赏

如果文章对您有帮助,您可以鼓励一下作者