HashMap的源码解析:https://mp.csdn.net/console/editor/html/106188425

HashSet:Java中的一个集合类,该容器不允许包含重复的数值

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 Mapprivate static final Object PRESENT = new Object();

可以看出,HashSet类继承了AbstractSet类,并且实现了Cloneable,Serizalizable接口。

HashSet是基于HashMap实现的,因此建立了map变量

PRESENT是用来填充map中的value,定义为Object类型。

下面先来看HashSet的构造方法:

1.无参构造
public HashSet() {map = new HashMap<>();}2.参数为一个HashSet的实例对象
public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}3.参数为初始化的大小以及负载因子
public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}4. 参数为初始化的大小
public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}5.参数为初始化的大小,负载因子,以及一个标志位
HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}//第五个构造函数为默认修饰符default,所以为包访问权限,只要是为了支持LinkedHashSet

接下来的iterator(),size(),isEmpty(),containss(),clear()方法都是基本上直接调用了HashMap的方法:

public Iterator<E> iterator() {return map.keySet().iterator();}public int size() {return map.size();}public boolean isEmpty() {return map.isEmpty();}public boolean contains(Object o) {return map.containsKey(o);}public void clear() {map.clear();}

add(),remove()把要加入,移除的值当作key,初始定义的PRESENT当作value来进行实现的

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

clone()方法:

@SuppressWarnings("unchecked")public Object clone() {try {HashSet<E> newSet = (HashSet<E>) super.clone();newSet.map = (HashMap<E, Object>) map.clone();return newSet;} catch (CloneNotSupportedException e) {throw new InternalError(e);}}

@SuppressWarnings("unchecked")表示告诉编译器忽视unchecked警告

直接调用了父类的clone方法

这里的clone是深拷贝,当原来的本体发生了改变,克隆体不会变,看下面这个例子:

public class test {@SuppressWarnings("unchecked")public static void main(String[] args) {HashSet<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(3);set.add(4);set.add(5);HashSet<Integer> set1;set1 = (HashSet<Integer>) set.clone();System.out.println(set+"  "+set1);set.remove(5);set.add(6);System.out.println(set+"  "+set1);}
}输出的结果为:
[1, 2, 3, 4, 5]  [1, 2, 3, 4, 5]
[1, 2, 3, 4, 6]  [1, 2, 3, 4, 5]

HashSet源码解析(最好先看HashMap的源码解析)相关推荐

  1. 调试JDK源码-一步一步看HashMap怎么Hash和扩容

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

  2. hashmap为什么用红黑树_要看HashMap源码,先来看看它的设计思想

    HashMap 是日常开发中,用的最多的集合类之一,也是面试中经常被问到的 Java 类之一.同时,HashMap 在实现方式上面又有十分典型的范例.不管是从哪一方面来看,学习 HashMap 都可以 ...

  3. JavaWeb三大组件之一——Filter过滤器源码解析(全面手撕Filter源码,需要耐心看完)

    什么是Filter? 本文所说的Filter是JavaWeb中常见常使用的过滤器.Filter的作用是拦截前端发送给后端的请求,一般是用于权限过滤.日志记录.图片转换.加密.数据压缩等操作. 大致流程 ...

  4. [源码解析] 从TimeoutException看Flink的心跳机制

    [源码解析] 从TimeoutException看Flink的心跳机制 文章目录 [源码解析] 从TimeoutException看Flink的心跳机制 0x00 摘要 0x01 缘由 0x02 背景 ...

  5. 震撼来袭,阿里高工的源码解析笔记手抄本,看完去怼面试官

    很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来. 但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了 ...

  6. 一个mapper接口有多个mapper.xml 文件_MyBatis 源码解析:映射文件的加载与解析(上)

    上一篇我们分析了配置文件的加载与解析过程,本文将继续对映射文件的加载与解析实现进行分析.MyBatis 的映射文件用于配置 SQL 语句.二级缓存,以及结果集映射等,是区别于其它 ORM 框架的主要特 ...

  7. HashMap 底层源码细致分析

    JDK集合HashMap 底层源码细致分析 前言 提示:对于初始 HashMap 的小伙伴来说,不推荐直接硬啃,建议先看一下如下几个视频教程之后再回头好好理解.(一遍看不懂则反复看,一小块一小块的找对 ...

  8. 【Java源码分析】Java8的HashMap源码分析

    Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...

  9. Java集合源码学习(四)HashMap

    一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景, 数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易: 哈希表的实现结合了这两 ...

最新文章

  1. 搭建ngrok服务器之扩展
  2. python_xlsxwriter模块
  3. 一般编译器错误_Java程序员最容易犯的10个错误
  4. tensorflow就该这么学--5( 神经网络基础)
  5. django.db.utils.DataError: (1406, Data too long for column 'gender' at row 1)
  6. python代码300行程序_Python:游戏:300行代码实现俄罗斯方块
  7. c语言二维数组省略号,LaTex 常用语法
  8. json字符串转java对象数组
  9. 2017双11技术揭秘—阿里数据库进入全网秒级实时监控时代
  10. .ai域名注册已经极具投资价值进入火爆期
  11. linux下在线新增大文件系统划分,linux - 文件系统(fdisk)
  12. 微服务之SpringCloud实战(五):SpringCloud Eureka详解
  13. 关于表数据行统计的问题和相关误区
  14. 存储过程和函数的操作
  15. sas 结果导出到excel 打不开解决办法
  16. 计算机cpu天体图,CPU天梯图2019年11月最新版 台式电脑处理器性能排名与选购建议...
  17. android解决方法数超过65536问题,(满则溢)Android AS打包提示方法数超65536的解决方法...
  18. Actor模型的本质
  19. require使用mysql_require的用法
  20. windows10神州网信政府版开启麦克风、相机

热门文章

  1. 程序员面试金典 - 面试题 01.02. 判定是否互为字符重排(哈希map)
  2. LeetCode 16. 最接近的三数之和(固定左端+滑动窗口)
  3. LeetCode 814. 二叉树剪枝(递归)
  4. Notepad++的json 格式化
  5. 2.MongoDB基本操作
  6. 腾讯天衍实验室招聘科研实习生
  7. Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
  8. 美团点评容器平台HULK的调度系统
  9. 论文浅尝 | 融合多层次领域知识的分子图对比学习
  10. NLP-美团技术团队(搜索-推荐-召回排序-Bert)