jdk源码浅读-HashSet

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

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

构造函数

/**

* Constructs a new, empty set; the backing HashMap 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 e to this set if

* this set contains no element e2 such that

* (e==null ? e2==null : e.equals(e2)).

* If this set already contains the element, the call leaves the set

* unchanged and returns false.

*

* @param e element to be added to this set

* @return true if this set did not already contain the specified

* element

*/

public boolean add(E e) {

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

}

contains方法

/**

* Returns true if this set contains the specified element.

* More formally, returns true if and only if this set

* contains an element e such that

* (o==null ? e==null : o.equals(e)).

*

* @param o element whose presence in this set is to be tested

* @return true 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 e such that

* (o==null ? e==null : o.equals(e)),

* if this set contains such an element. Returns true 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 true if the set contained the specified element

*/

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

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

1、只要弄懂HashMap就很容易明白HashSet了,可以参考这篇文章:jdk源码浅读-HashMap https://www.cnblogs.com/rainple/p/9927263.html

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

这里给大家推荐一个学习路线

架构筑基专题

13467292-3975b22c9bd81e53

开源框架源码

13467292-f74f1d6f34640d7e

高性能架构

13467292-2d1526be3f573317

微服务

13467292-08a7df9209c7e418

团队协作开发

13467292-56d70b6026c06906

B2C商城

13467292-84c77959b3c40fe7

现在加群即可获取更加详细的Java架构脑图,还有Java工程化、高性能及分布式、高性能、高架构、zookeeper、性能调优、Spring、MyBatis、Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限及相关视频资料,群号:923116658

点击链接加入群聊【Java架构解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值