简单谈谈对HashMap集合的理解

此文适合有基础的同学阅读,不建议初学者阅读

首先基础概念:

      HashMap是线程不安全的集合,允许空键(key=null)空值(value=null),因为他是一个线程不安全的集合,允许多个线程同时操作,底层方法没有加synchronize线程锁,所以效率较高,底层为数组加单向链结构,jdk1.8的数组名称为node,jdk1.7之前的数组名称为entry,HashMap实现与jdk1.2的Map接口。HashMap允许将null作为一个entry的key或者value。

 

在HashMap的Entry中有四个变量,key、value、hash、next,其中next用于在hash方法添加值冲突时候,所指向的下一个值。

添加方法:

  1. 对key进行hash计算,用等到的hash值除以当前集合的容量,也就是数组的大小,取余数,根据余数存到对应的下标位置index。(在HashMap如果传入的key为null,hash值会设置为null,在执行添加的时候会先进行判断key的值是否为null)
  2. 如果index所指向的数组元素为空,则直接指插入,如果不为空,则依次查找entry中next所定的元素,判读key是否相等,如果相等,则替换久的值。(先是根据hash值进行判断的,如果hash值相同再进行判断key的值,因为hash值会用重复的)
  3. 如果没有相等的,将之前第一个元素entry,添加到我们待新添加的entry的next变量中。(就是将后添加的放到最前面)。

 

扩容机制:

HashMap默认的负载因子为0.75f  默认的初始大小为16

数组大小*负载因子=要调整大小的值(临界值)

 

    从源代码来看HashMap,在添加时执行扩容方法,执行扩容方法时必须两个条件同时相等,(链表的总条数>=要调整大小的值)和当前要添加的值的索引位置不为null(也就是说当前要添加值得索引位置里面有值),才会执行扩容方法,扩容的大小为原来的数组长度乘以2(原来的数组长度的二倍)。扩容之后所有元素还会根据key来重新计算hash值进行重新添加元素,重新执行顺序为下标从0开始,里面的链表从外层开始。

 

    在调用构造方法里没有开辟数组空间

 

 HashMap查询机制 :

        先根据hash值计算得到下标,然后进行遍历链表从而得到想要的值

HashMap优化:

    空间换时间:将负载因子调小,这样的话链表的长度就会变短,但是数组的长度就会变大,比较占内存,但效率就会变高。

    时间换空间:将负载因子调大,这样的话链表的长度就会变长,但是数组的长度就会变小,比较省内存,但效率就会变低。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
hashmap的底层原理 hashmap产生死锁的原因 hashmap的容量为什么一定要是2的幂呢 TreeMap的底层原理 HashMap,Hashtable和ConcurrentHashMap的区别 在ArrayList和LinkedList尾部添加元素,谁的效率更高 如果HashMap或者hashTable的key是一个自定义的类该怎么办 为什么重写equals还要重写hashCode? 介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,protected,以及不写时的区别 为什么java中有些接口没有任何方法 java中的clone方法有什么作用 面向对象有哪些特征 面向对象的开发方式有什么优点 组合和继承有什么区别 多态的实现机制是什么 重写和重载的区别 抽象类和接口有什么区别 break如果跳出多重循环 final,finally和finalize有什么区别 使用switch时有哪些注意事项 instanceof有什么作用 什么是不可变类 类型转换 Math类的round,ceil和floor方法 值传递和引用传递有什么不同? char型变量是否可以存储一个中文汉字 s=null和s=” ”是否相同 new String(“abc”)创建了几个对象 String变量做“+”运算时的编译优化 "=="和equals方法究竟有什么区别 String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) JVM内存模型1.7和1.8的区别 如何判断一个对象是否是垃圾对象 垃圾回收算法 Minor GC和Full GC 垃圾收集器 集合的继承体系 Collection 和 Collections的区别。 如何通过jdbc访问数据库 JDBC处理事务采用什么方法 Statement和PreparedStatement的区别 getString()方法和getObject()方法有什么区别 jdbc和hibernate有什么区别 http1.0和http1.1和http2.0的区别 http和https的区别 http缓存 cookie和session forward与redirect区别 页面请求的工作流程 HTTP中的GET和POST方法有什么区别 什么是Servlet servlet是线程安全的吗 Servlet的生命周期 JSP和Servlet的区别和联系 什么是MVC模型 TCP的连接和释放过程 什么是长连接和短连接 长连接是如何实现的 计算机网络体系结构 谈谈你对Struts的理解谈谈你对Hibernate的理解谈谈你对Lucene和solr的理解 谈谈你对ActiveMQ的理解 Spring的IOC,DI和AOP 谈谈你对webservice和dubbo的理解 谈谈你的SOA的理解谈谈你对freemarker的理解 谈谈你对springMVC的理解 谈谈你对mybatis的理解 hibernate和mybatis的区别 同步接口和异步接口的区别 为什么要加入锁机制 如何确定是否应该上锁?即如何判断是否有线程安全问题 什么是markword 乐观锁和悲观锁 偏向锁 轻量级锁 自旋锁 自适应自旋锁 重量级锁 synchronized 可重入锁 土方法实现可重入锁 使用AQS类实现可重入锁 CAS MySQL 中的行级锁、表级锁和页级锁 java中的死锁 公平锁和非公平锁 锁的总结 锁的优化 .......... 还有好多,不想写了,太多了,都是题主呕心沥血总结的

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值