欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jdk源码浅读-HashSet

程序员文章站 2022-05-03 22:51:01
通过阅读源码发现,HashSet底层的实现源码其实就是调用HashMap的方法实现的,所以如果你阅读过HashMap或对HashMap比较熟悉的话,那么阅读HashSet就很轻松,也很容易理解了。我之前也写了一篇关于hashMap源码阅读的文章,可以点击这里查看。 使用过HashSet的都清楚它保存 ......

  通过阅读源码发现,hashset底层的实现源码其实就是调用hashmap的方法实现的,所以如果你阅读过hashmap或对hashmap比较熟悉的话,那么阅读hashset就很轻松,也很容易理解了。我之前也写了一篇关于hashmap源码阅读的文章,可以点击查看。

  使用过hashset的都清楚它保存的元素是不可以重复的,其实hashset的元素都是保存在hashmap的key中的,而hashmap的key是没有重复的。

  构造函数

/**
     * constructs a new, empty set; the backing <tt>hashmap</tt> instance has
     * the specified initial capacity and the specified load factor.
     *
     * @param      initialcapacity   the initial capacity of the hash map
     * @param      loadfactor        the load factor of the hash map
     * @throws     illegalargumentexception if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    public hashset(int initialcapacity, float loadfactor) {
        map = new hashmap<>(initialcapacity, loadfactor);
    }

  hashset的构造方法都是直接调用了hashmap的构造方法,hashset有很多个构造方法全部都是直接调用了hashmap的构造方法。

  add方法

/**
     * adds the specified element to this set if it is not already present.
     * more formally, adds the specified element <tt>e</tt> to this set if
     * this set contains no element <tt>e2</tt> such that
     * <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>.
     * if this set already contains the element, the call leaves the set
     * unchanged and returns <tt>false</tt>.
     *
     * @param e element to be added to this set
     * @return <tt>true</tt> if this set did not already contain the specified
     * element
     */
    public boolean add(e e) {
        return map.put(e, present)==null;
    }

  contains方法

 /**
     * returns <tt>true</tt> if this set contains the specified element.
     * more formally, returns <tt>true</tt> if and only if this set
     * contains an element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
     *
     * @param o element whose presence in this set is to be tested
     * @return <tt>true</tt> if this set contains the specified element
     */
    public boolean contains(object o) {
        return map.containskey(o);
    }

  remove方法

 /**
     * removes the specified element from this set if it is present.
     * more formally, removes an element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>,
     * if this set contains such an element.  returns <tt>true</tt> if
     * this set contained the element (or equivalently, if this set
     * changed as a result of the call).  (this set will not contain the
     * element once the call returns.)
     *
     * @param o object to be removed from this set, if present
     * @return <tt>true</tt> if the set contained the specified element
     */
    public boolean remove(object o) {
        return map.remove(o)==present;
    }

 其他的方法也都是直接调用hashmap的方法,所以在这里就不用贴出来了。

  1、只要弄懂hashmap就很容易明白hashset了,可以参考这篇文章:jdk源码浅读-hashmap

  2、我自己在看源码的时候也手写了hashmap、hashset等数据结构的类,大家可以下载下来参考一下,有不懂或不理解的地方可以问我,如果有什么问题也随时欢迎骚扰。项目地址:https://github.com/rainple1860/mycollection