HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢。

  HashMap是日常中非常常用的一种数据结构,我们要想深入了解学习任何一门技术,都是要先应用,再深入。深入就要了解实现的原理,在java语言中,最基本的结构是数组以及类变量(引用),HashMap是两者的结合,更明确的说,HashMap是数组以及链表的结合。

public class HashMap<K, V>extends AbstractMap<K, V>implements Map<K, V>, Cloneable, Serializable
{private static final long serialVersionUID = 362498820763181265L;static final int DEFAULT_INITIAL_CAPACITY = 16;static final int MAXIMUM_CAPACITY = 1073741824;static final float DEFAULT_LOAD_FACTOR = 0.75F;static final int TREEIFY_THRESHOLD = 8;static final int UNTREEIFY_THRESHOLD = 6;static final int MIN_TREEIFY_CAPACITY = 64;transient Node<K, V>[] table;transient Set<Map.Entry<K, V>> entrySet;transient int size;transient int modCount;int threshold;final float loadFactor;
...
}

  我们可以看到HashMap维护了一个Node<K,V>数组,在这里我们再看Node的实现

 static class Node<K, V>implements Map.Entry<K, V>{final int hash;final K key;V value;Node<K, V> next;
.....
}

Node维护了四个属性,Key,Value,Hash码,以及关键的:Node<K,V> next,每一个Node持有下一个Node,形成了链表。

  在这里奉上一张HashMap的导图,当我们插入一个值时,即插入了一个Node,通过Node的key的hashcode与Node<K,V> table 数组的长度来计算出这个Node在数组中的位置,也就是下标。计算的方法就是hash算法,当我们插入一个Node的时候,Key是唯一的,但是不同的key求出的hashcode

转载于:https://www.cnblogs.com/beforedawn/p/6850038.html

详解HashMap数据结构实现相关推荐

  1. 【算法详解】数据结构:7种哈希散列算法,你知道几个?

    一.前言 哈希表的历史 哈希散列的想法在不同的地方独立出现.1953 年 1 月,汉斯·彼得·卢恩 ( Hans Peter Luhn ) 编写了一份IBM内部备忘录,其中使用了散列和链接.开放寻址后 ...

  2. 【线索二叉树详解】数据结构06(java实现)

    线索二叉树 1. 线索二叉树简介 定义: 在二叉树的结点上加上线索的二叉树称为线索二叉树. 二叉树的线索化: 对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为 ...

  3. 详解HashMap的内部工作原理

    本文将用一个简单的例子来解释下HashMap内部的工作原理.首先我们从一个例子开始,而不仅仅是从理论上,这样,有助于更好地理解,然后,我们来看下get和put到底是怎样工作的. 我们来看个非常简单的例 ...

  4. Java基础:详解HashMap在多线程下不安全

    今天想知道HashMap为什么在多线程下不安全,找了许多资料,终于理解了. 首先先了解一下HashMap: HashMap实现的原理是:数组+链表 HashMap的size大于等于(容量*加载因子)的 ...

  5. 详解HashMap的put方法

    关于HashMap,在面试中几乎是必问的考点,记得我第一次面试,面试官上来就是说一下HashMap的put方法.不过当时还好做好了准备,这些也是能够轻松回答出来.值得注意的是,从JDK1.7到JDK1 ...

  6. 详解高级数据结构之 跳表

    目录 一.跳表的介绍 二.跳表的数据结构图 三.跳表的查找 四.跳表是不是很浪费内存? 五.跳表高效的动态插入和删除 跳表索引动态更新 六.跳表的特性 七.小结 八.C++实现简易跳表 一.跳表的介绍 ...

  7. 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...

  8. 直接插入排序、冒泡排序实验详解【数据结构实验报告】

    文章目录 一.直接插入排序 二.冒泡排序 一.直接插入排序 1.算法思想 直接插入排序(straight insertion sort),有时也简称为插入排序,是减治法的一种典型应用.其基本思想如下: ...

  9. 详解+G - 数据结构实验之栈与队列七:出栈序列判定

    理解: 出入栈规律之一,如果前面有一个比较大的数,后面有连续的递增顺序,递增顺序>=2个小于前面比较大的数,那么此出栈顺序不可能实现.比如4,1,2,3,5. 思路:输入一个数,然后不断按照顺序 ...

最新文章

  1. [LeetCode] Restore IP Addresses 复原IP地址
  2. [导入]日志 20071211(WCF,实验室产品)
  3. k8s 更改pod数量限制(默认每个节点最多110组pod)0/3 nodes are available: 3 Insufficient cpu报错排查
  4. Linux centosVMware zip压缩工具、tar打包、打包并压缩
  5. ruby 数据sql操作
  6. android 网络连接 网络是否可用,Android 使用ping判断网络/WIFI连接是否可用
  7. oracle select之后自动保存excel_Excel制作自动化仓库入库单,数据录入、计算、保存只需一键完成...
  8. maven eclipse操作
  9. 【毕业设计】PHP公共课平时成绩查询系统(源代码+论文+答辩PPT)
  10. latex 箭头_Pandoc上手以及如何使得latex文件转换为Docx文件(MAC)
  11. Uber开源深度学习工具Ludwig学习实践
  12. 显示“没有注册类”问题解决方法(mscomm)
  13. cs229吴恩达机器学习课件
  14. Oracle函数HEXTORAW乱码,Oracle常用函数之HEXTORAW
  15. Python进行Excel数据处理
  16. python枚举详解
  17. VirtualBox 磁盘扩容(亲测有效)
  18. 《运营力——微信公众号 设计 策划 客服 管理 一册通》导读
  19. ITILv4 MP认证以及证书展示
  20. pytorch自定义forward和backward函数

热门文章

  1. 5.深度学习练习:Deep Neural Network for Image Classification: Application
  2. 华为服务器怎么查看系统日志,华为日志服务器
  3. 数组填充php,php数组入门教程之数组填充
  4. Eclipse中使用Checkstyle,checkstyle插件检查java代码的自定义配置文件:
  5. java pdf stamper_PDFStamper在几个PDF文件上失败(itext 5.5.1)
  6. leecode11 盛水最多的容器
  7. 【大总结1】数据结构与传统算法总结
  8. 《Java8实战》笔记(01):为什么要关心Java8
  9. linux版车机安装步骤,RedHat Linux 9.0的安装(详细图解安装过程)
  10. C++primer 第 3 章 字符串、向量和数组 3 . 4 迭代器介绍