想必大家都知道HashSet和HashMap之间的关系,HashSet是依赖于HashMap的,HashSet集合就是HashMap的key所组成的集合,我们都知道HashMap的value是可以重复的,但是key是不能重复的,同样我们也清楚Map集合是无序的,所以HashSet集合的特点就是 无序且保证元素不重复。

  但是其实作为一个有经验的开发人员来说,至少我们应该是大概扫过源码的,所以面试时答上面那些是不够的,其实大家在最开始学的都是懵懵的,总是一种 “我是谁,我在哪,我要干什么的 感觉”,反正我学东西最开始都是这种感觉,好了不扯了。回到咱们研究的问题上来,HashSet创建时都做了哪些步骤,底层到底是怎么实现的,请继续往下看

  首先,我们创建HashSet集合都是调用它的构造方法,HashSet提供了好几个构造方法,可以传递 初始容量和 加载因子,其实无论你创建HashSet时调用的是哪个构造方法,底层调用的都是HashMap的这个构造方法,注释写的比较详细,理解了这张图,再往下继续看

下面我们再来聊一下put方法是如何保证map的key唯一?

hashmap中key为null的元素肯定是保存在table[0],当hash冲突发生时,采用链地址法来解决冲突,使数据能够正常保存,不过map长度为偶数已经尽量在避免hash冲突,保证存入map的数据尽量均匀分布,当map中元素大于等于临界值threshold(map容量乘以加载因子)时,resize()方法会对map进行扩容,是之前容量的2倍,在扩容之后会对将原table中的数据经过重新计算索引后放入新的table中,transfer()方法就是最耗费时间的重新赋值的操作。赋值完成后,会将新添加的元素放入扩容之后的map中。

面试加分项---HashMap底层实现原理的更多相关文章

  1. Java面试必问之Hashmap底层实现原理(JDK1.7)

    1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...

  2. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)

    HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...

  3. HashMap底层实现原理及面试常见问题

    HashMap底层源码分析 1.HashMap底层采用的存储结构 1.在JDK1.7及之前采用的存储结构是数组+链表 2.到了JDK1.8之后采用的是数组+链表+红黑树 2.HashMap实现的原理 ...

  4. 【转载】HashMap底层实现原理及面试问题

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  5. HashMap底层实现原理及面试问题

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  6. Java面试必问之Hashmap底层实现原理(JDK1.8)

    1. 前言 上一篇从源码方面了解了JDK1.7中Hashmap的实现原理,可以看到其源码相对还是比较简单的.本篇笔者和大家一起学习下JDK1.8下Hashmap的实现.JDK1.8中对Hashmap做 ...

  7. HashMap底层实现原理(JDK1.8)源码分析

    ref:https://blog.csdn.net/tuke_tuke/article/details/51588156 http://www.cnblogs.com/xiaolovewei/p/79 ...

  8. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  9. Java中HashMap底层实现原理(JDK1.8)源码分析

    这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JD ...

随机推荐

  1. Python 使用sys.exc_info自己捕获异常详细信息

    一般程序中,我们需要对异常进行捕获来保证程序的健壮.但是debug的时候,我们可能需要异常的详细信息,这时可以使用sys.exec_info来处理: import traceback import s ...

  2. 录制JMeter脚本的方式

    一.使用BadBoy录制JMeter脚本 JMeter和BadBoy下载地址:点击去下载 1.打开BadBoy并输入你要录制脚本的网址 这里我输入百度的网址,可以看到step下已经有一个请求了 2.录 ...

  3. Go语言判断if else语句

    基本格式: if 条件语句{ 执行语句 }else{ 执行语句 } package main import "fmt" func main(){ fmt.Println(Add(- ...

  4. Centos7 安装Nginx 防火墙开放80端口给外网访问

    Centos7的防火墙改成了firewall,不再叫iptables,开放端口的方法如下: firewall-cmd --zone=public --add-port=80/tcp --permane ...

  5. php 会话控制(关于session的维护与生命周期)

    Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器创建生成一个唯一的sessionID,用该sessionID为标识符来存取服务器端的Session存储空间,在会 ...

  6. ubuntu安装驱动问题

    网友答案:https://blog.csdn.net/jasonzhoujx/article/details/80469139

  7. PHP批量保存图片到服务器再上传阿里云

    /* * 批量传输产品主图到阿里云 */ public function transferImage(){ $num = 50; $p = isset($this->request->ge ...

  8. tomcat 绑定域名 防止恶意域名绑定

    http://aaronlong31.iteye.com/blog/1123260 今天公司一台服务器被很多恶意域名绑定了,电信的要我们赶紧处理,否则封IP. 服务器使用的是tomcat,上谷歌搜了很 ...

  9. FPGA中iic总线上,应答ACK解析

    首先要明白一点,有效ACK是指第9位为低电平,第十位,十一位就管不着了,(我写的代码发现第九位为低电平,之后复位为高电平,开始没注意后来搞的很是头痛) 主机发ack和主机检测ack,主机发ack是在从 ...

  10. 过滤器手动注入Service Bean方法

    @Override public void init(FilterConfig arg0) throws ServletException { ServletContext servletContex ...