Java基础 之 hashSet源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34083066/article/details/86756657

说道set大家都知道无重复。那么到底是如何做到无重复的呢

今天来看下Set接口的一个具体实现,hashSet的源码分析,因为并不难,所以简短说了。

hashSet

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

构造器

直接新建了一个hashmap。

add

    private static final Object PRESENT = new Object();

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

调用map的put方法。

clear

    public void clear() {
        map.clear();
    }

调用map。

remove

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

我去。往里一看,原来hashSet里面的内部实现其实是一个hashMap啊。

只是对hashmap做了一层包装。所有的值都保存在了hashMap的key中,所有的key都指向堆内存中的一个object对象。

关于hashMop传送门:Java基础 之 HashMap源码分析和hashcode及equal的对比

那么为什么要这么实现呢?

其实我理解这就是hashSet实现了去重的关键原因。

再hashMap分析时我们分析了,hashMap是一个hash表,所以他node是存在hash,key,value,next的,key进入hashmap要先去运算他的hash值,如果他的hash值不等,那么他们肯定不等。

所以hashset的值存在hashmap的key中的话,就可以保证他没有重复了。这也就是为什么我们的map的key可以通过keySet方法输出一个hashSet的集合了。

猜你喜欢

转载自blog.csdn.net/qq_34083066/article/details/86756657