`
aawty
  • 浏览: 30729 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

http://beyond99.blog.51cto.com/1469451/429789/

HashMap通过链地址法(拉链法)解决hash冲突,按照存储结构来讲是数组(散列桶)与链表的组合体。

Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。

当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
 
 HashMap的resize(rehash):
当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。
那么HashMap什么时候进行扩容呢?当HashMap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,加载因子loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。
 
HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。
容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。
加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。loadFactor:加载因子 loadFactor定义为:散列表的实际元素数目(n)/ 散列表的容量(m)。
分享到:
评论

相关推荐

    HashMap详解(通俗易懂)

    这个文档“ HashMap详解(通俗易懂)”很好的阐述了hashmap的底层数据结构示意,希望对学习java的人有帮助

    Java数据结构-HashMap详解

    主要介绍了Java数据结构-HashMap,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java7hashmap源码-backend-study:后端学习之路

    随着Java学习的不断深入,发现很多知识在脑海里都是一个个碎片,建此仓库的目的希望把零碎的知识点都整合起来,提高自己的学习效率。欢迎志同道合的朋友,一起来维护该仓库 目录 网络基础 WEB TCP协议 HTTP/HTTPS ...

    JAVA中哈希表HashMap的深入学习

    主要介绍了哈希表HashMap的深入学习,哈希表是一种非常重要的数据结构,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中HashMap的实现原理进行讲解。感兴趣的话可以...

    小白,和我一起学 HashMap 吗?

    目录1、前言2、简介3、底层数据结构4、存取原理4.1 采用头插法(JDK1.7)4.2 确定key的存放位置(JDK1.7)4.3 确定key的存放位置(JDK1.8)5、扩容机制5.1 ...如果你正在学习HashMap,希望对你有帮助。 . 文末有一些常

    jdk1.8中文文学习手册

    在jdk1.8中对hashMap等map集合的数据结构优化。hashMap数据结构的优化 原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode ...

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    这篇集合总结一共包括十二节,介绍了一些接口和实现类的底层源码以及基本的增加、删除元素等的操作(包括List、Map、Set接口、ArrayList、Vector、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类)。...

    自定义实现常用数据结构 -java版代码.rar

    从源码学习jdk,自定义实现java 数据结构 HASHMAP LINKEDHASHMAP 红黑树等

    基本数据结构的模拟

    对基本数据结构的模拟,实现arrayList,hashMap,树,队列,栈的基本方法,对于学习数据结构有一定的帮助 LinkedList[] arr = new LinkedList[999]; // 键值对集合! Map底层结构是:数组 + 链表 int size = 0; // ...

    java7hashmap源码-learning-record:学习轨迹记录

    学习轨迹记录 10月1号 7月18号 基础算法:反转单向链表 7月16号 7月11号 7月9号 复习 : HashTable和HashMap的区别详解 LeetCode 27. 删除元素(Remove Element) 7月8号 7月5号 复习hashMap concurrentHashmap ...

    java7hashmap源码-for-java:java学习笔记

    hashmap源码 Java学习笔记 Effective Java Topic2:插件销毁对象 2. 多参数情况 使用重叠构造器; 使用Build模式【构建器】: new A.Build().set.set.build(); Build模式也适用于类层次结构 递归类型参数 /* * 递归...

    java7hashmap源码-ReviewNotes:记录平常学习Java的笔记

    hashmap源码 - 计算机网络 7层结构 自底向上分别是: 物理层:负责透明传输比特流 数据链路层:负责将网络层传下来的IP数据报组装成帧,检测和校正物理层传输介质上产生的传输差错,具体的有PPP,STP 网络层:负责为...

    常见的数据结构学习

    对于基础数据结构的基本学习 1、二叉树 2、红黑树 红黑树也叫二叉自平衡树,是在二叉树的基础上,增加了自平衡功能。不至于让二叉树一端结点数过于多,而导致整棵树的高度过高,从而影响遍历效率。在Java1.8以后,...

    Java学习笔记包含JVM、spring、源码分析、多线程、offer题解、设计模式、面试宝典.zip

    Java学习笔记,内容包括JVM,spring,hashMap实现源码分析,多线程,剑指offer题解,设计模式。然后根据面试的重点,又将很多从里面抽出,专门整了个面试的分类,如果是看面试的东西的话,可以重点看这个。 | 书籍 |...

    java8源码-FiveYears:学习/总结/成长/记录

    :revolving_hearts:数据结构和算法 CH LFU LRU :woman_biking:网络 :hollow_red_circle:操作系统 Linux :information:数据库 Oracle MYQL 事务 - 未学习 Redis 持久化机制 - 未学习 内存淘汰机制 - 未学习 分片机制 ...

    「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识

    HashMap(JDK1.8)源码+底层数据结构分析 ConcurrentHashMap 源码+底层数据结构分析 IO IO 基础知识总结 IO 设计模式总结 IO 模型详解 并发 知识点/面试题总结 : (必看 ) Java 并发常见知识点&面试题总结(上) Java ...

    自己画的以及收集汇总的各大常用流行框架的重要图(原理图、流程图、说明图、架构图...等)

    docker、dubbo、elasticsearch、fastDFS、Git、hashMap、jvm、MongoDB、mybatis、nio、rabbitMQ、Redis、rocketMQ、socket编程、spring、springboot、springcloud、springsecurity、多线程、异常体系、IO流、学习...

    「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识 准备 Java 面试,首选.zip

    HashMap(JDK1.8)源码+底层数据结构分析 ConcurrentHashMap 源码+底层数据结构分析 IO IO 基础知识总结 IO 设计模式总结 IO 模型详解 并发 知识点/面试题总结 : (必看 ) Java 并发常见知识点&面试题总结(上) Java ...

    java内部学习笔记.docx

    4.21 Map集合的实现类HashMap 46 4.22单例模式和模版方法模式 48 Java SE核心II 49 5.1 Java异常处理机制 49 5.2 File文件类 51 5.3 RandomAccessFile类 53 5.4基本流:FIS和FOS 55 5.5缓冲字节高级流:BIS和BOS 56 ...

Global site tag (gtag.js) - Google Analytics