HashMap是无序的,底层是哈希表(数组+单向链表+红黑树)
LinkedHashMap是有序的; 数组+双向链表
所以,当我们需要存储的元素有序拿出,那就使用LinkedHashMap。

但是,以上两个都是线程不安全的,想使用安全的map集合可以用juc包下的concurrentMap或者Collections下的synchronizedMap

哈希表 在jdk8前是数组+链表 ,jdk8后市数组+链表+红黑树
HashMap 有加载因子0.75,默认长度为16,自动桶数(数组大小)一倍扩容(超过12扩容,小于8恢复)
链表长度大于8从链表变成红黑树,小于6就是冲红黑树变成链表。

细说hashmap的底层

哈希表 = 数组 + 链表 + 红黑树

问题:为什么jdk8后又添加了红黑树呢?
答:因为,链表是按照顺序存储的,但是红黑树是按照值去存储的树状结构。
当桶内数据越来越多时,链表的查询效率显然就弱了,所以在超过一定存储数量之后,桶内的存储结构就从链表替换为了红黑树.默认是当大于8个元素时会转为红黑树

首先,明白几个概念:

  • 链表相当于node节点(由头部和地址组成;暴露头部,隐藏引用地址)数组
  • 默认数组大小为16,表示有16个桶bucket
  • 链表)或者红黑树是存储在数组每个元数(桶)中,开始是默认长度为8的链表,超过8变成红黑树,小于6 又回到链表

存储和取出数据

  • 数据存储:把key求取hash值,拿着这个hash值去找桶,找到桶后,存储在链表或者红黑树中

  • 数据取出:也是通过key的hash值去找到对应的桶,然后判断桶是链表还是红黑树,链表就遍历查找,红黑树TODO查找

这里杠精可能会说又对象不一样,但是hash值相等的情况,如何解决呢?请看下面

就拿取出数据来说:(1) 获得key的hashcode,通过hash()散列算法得到hash值,进而定位到数组的位置(哪一个桶)。(2) 在链表上挨个比较key对象。 调用equals()方法(解决了上诉的问题),将key对象和链表上所有节点的key对象进行比较,直到碰到返回true的节点对象为止。(3) 返回equals()为true的节点对象的value对象。

同理可以反推存储过程。

hashmap源码

//桶数量的默认值(16),而不是桶内可以装的元素的数量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//必须为2的n次方,所以最大为2^30
static final int MAXIMUM_CAPACITY = 1 << 30;
/*默认负载系数为0.75,当表中超过75%的位置已经填入元素,这个表就会用双倍的桶数自动地进行再散列(rehashed),可以通过构造函数初始化
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;//桶内数据量超过这个阈值就会将桶内数据结构从链表转为红黑树
static final int TREEIFY_THRESHOLD = 8;//当小于这个数值时将红黑树转为链表
static final int UNTREEIFY_THRESHOLD = 6;//在第一次使用时初始化Node数组,桶对象数组
transient Node<K,V>[] table;//该HashMap中共有多少个键值对
transient int size;//桶的数量,默认为DEFAULT_INITIAL_CAPACITY,即16
int threshold;

分析:

  • 1 << 4;表示左移,就是移动2的多少次幂,1 * 2^4= 16
  • table就是桶,是一个node数组,那就表示可以存储链表和红黑树
  • threshold 是桶的个数,也就是数组的大小,为16

hashmap的底层相关推荐

  1. Java面试 - HashMap的底层实现,之后会问ConcurrentHashMap的底层实现

    HashMap的底层实现 ConcurrentHashMap的底层实现 HashMap 线程不安全  ,底层实现,哈希桶(Node链表.数组),每个Node的key,即Hash值Key,Value可能 ...

  2. HashMap的底层原理 cr:csdn:zhangshixi

    1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...

  3. 为什么要学习HashMap的底层原理?

    本文转载自公众号  码农翻身 上周发了一篇文章<漫画:什么是HashMap?>,引起了不少人的讨论,有一个人的留言引发了我的思考:"作为一个程序员, 真的有必要学习这些底层原理吗 ...

  4. 复习一波,hashMap的底层实现原理

    前言 HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构: java中集合的分类: java中的集合可以分为:单列集合(collectio ...

  5. HashMap的底层原理你真的知道?

    HashMap的底层实现原理是面试中出现频率非常高的一道面试题,本文将对HashMap的底层实现原理做一个简要的概况和总结,便于复习. 一.对于Map集合存储结构的理解 首先介绍以HashMap为典型 ...

  6. HashMap的底层实现

    1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所 ...

  7. HashMap 的底层原理

    HashMap 的底层原理 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...

  8. 为什么使用HashMap需要重写hashcode和equals方法_最通俗易懂搞定HashMap的底层原理...

    HashMap的底层原理面试必考题. 为什么面试官如此青睐这道题? HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的坎,接下来我用最通俗 ...

  9. HashMap的底层存储结构和实现原理

    文章目录 前言 一.HashMap是什么? 二. 数组 三. 链表 四.哈希算法 五.哈希冲突 总结 前言 HashMap实现了Map接口,我们常用来put/get操作读存键值对数据,比较典型的key ...

  10. 面试题:HashMap的底层运行原理(通俗易懂)

    一图带你读懂HashMap的底层运行:

最新文章

  1. ADO.Net练习1
  2. 三级栏目选项卡 html,李长河 中文主页 实验题目三级页面(隐藏栏目,用于放置对应三级页面) 中国地质大学(武汉)教师个人主页系统...
  3. java form 对象 一对一_java-双向一对一地“对象引用了一个未保存...
  4. 中国代工厂的困惑:把大牌t恤卖到99块3件,还会有人买吗?
  5. [精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡
  6. 内联元素,取消间隙和默认效果
  7. 使用组策略限制设备使用
  8. php session 框架,CakePHP框架Session设置方法分析
  9. sqlite3---终端操作
  10. 中缀表达式转后缀表达式详解
  11. vscode程序员推荐字体
  12. python进阶之学习笔记_Python进阶学习笔记
  13. 怎么自学plc和自动化技术?
  14. 最新版PandoraBox潘多拉安装adbyby去广告插件图文详细教程!!
  15. python画矢量图_用Python把图做的好看点:用Pyecharts做个交互地图(三)-导出矢量图...
  16. 自动白平衡技术(AWB)
  17. Android 之 日期时间 时区同步
  18. 如何从ST官网下载STM32标准库
  19. flex 布局,省略号失效
  20. 高数 | 【无穷级数】证明:绝对收敛一定收敛

热门文章

  1. IT服务器台账系统,it项目管理信息系统
  2. linux opendir路径_Linux目录操作函数:opendir/readdir/closedir
  3. Dymola-多学科系统仿真工具
  4. Unity3D研究院之mac上从.ipa中提取unity3D游戏资源
  5. c语言开发unity,[Unity3D]U3D开发项目总结
  6. 宋浩老师线性代数知识卡片
  7. java毕设项目教务排课系统(附源码)
  8. 微信小程序上传照片到服务器
  9. 适用于Android的最佳笔记应用程序以及如何制作自己的应用程序
  10. 嵌入式Linux用java_嵌入式linux 开发步骤详细解析(Hello Embedded World)