hashSet 源码解析

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

1. 简介

jdk原注解:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
hashSet是无序、不重复的队列,能够快速查找。那么它为什么是无序、不重复的呢?看源码解析

2. 源码

hashSet的数据都是存储在其内部的map当中的,在其创建的时候初始化map

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<>();
    }

新增的时候就是将数据放入map的Key中,而map的value固定都是Object。

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

这时候就很清楚了,为什么hashSet是无序、不重复的。因为hashMap的存储就是无序、不重复的(相同的key会覆盖)。
那么为什么hashSet查找效率要比数组和链表快呢?因为hashMap的链表头部是根据hash散列的,那么查找的时候直接进行hash定位就行了,不需要每个元素都遍历。

猜你喜欢

转载自blog.csdn.net/wzl1369248650/article/details/82428990