Java HashSet源码分析(JDK 1.8)

首先看一下HashSet的继承关系。


未命名文件.png

HashSet实现了set接口,内部不允许有重复的值。

成员变量

private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

可以看到HashSet内部有两个成员变量,HashMap和Object。

构造方法

  public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

HashSet的构造方法都创建了HashMap对象。

add(Object o)

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

在HashSet的add方法中直接调用了map的put方法,key值就是我们添加的对象,value值是成员变量,也就是一个Object对象。
因此,HashSet内部是使用HashMap来实现的,存放的key就是我们添加的对象,存放的value就是一个Object对象。

remove(Object o)

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

contains(Object o)

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

其他方法都是基于HashMap来实现的,就不多说了。
总结:HashSet内部有一个HashMap,每放入一个A,就在内部的HashMap中放入这样一个结点:他的key是需要放入的对象,value是一个Object类型的成员变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,268评论 0 2
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,977评论 0 13
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,096评论 0 4
  • Map Map集合介绍   Map(也称为字典、关联数组)是用于保存具有映射关系的数据,保存两组值,key和val...
    Hughman阅读 361评论 0 1
  • 本系列出于AWeiLoveAndroid的分享,在此感谢,再结合自身经验查漏补缺,完善答案。以成系统。 Java基...
    济公大将阅读 1,541评论 1 6