HashMap的底层是数组+链表,(很多人应该都知道了)
JDK1.7的是数组+链表
(1.7只是一个例子,以前的话也是这样后面就以1.7为例子了)
首先是一个数组,然后数组的类型是链表
元素是头插法
JDK1.8的是数组+链表 或者 数组+红黑树
首先是一个数组,然后数组的类型是链表
在链表的元素大于8的时候,会变成红黑树
在红黑树的元素小于6的时候会变成链表
元素进行尾插

HaspMap的数组默认大小为16
数组也叫做Hash桶
(貌似听说这个值和阿里巴巴Java开发手册好像有点关系)

HashMap元素的下标是
HashCode(元素) & (数组的长度-1)

HashMap的扩容 Resize

扩容的话,这里有一个值叫做loadFactor(阈值),默认值为0.75;
当数组的 元素数量>数组大小(默认16)* loadFactor(默认0.75)
就会触发扩容,扩容是二倍扩容的 (默认是16扩容后就是32)
这时原来每个元素的下标也会改变的(因为数组的长度变了)
然后就要把每个元素重新分配下标,重新加入链表或者红黑树

HashMap线程不安全
在put的时候,Resize(扩容)会造成数据的覆盖
JDK1.7 因为是头插法,可能会造成循环链表
JDK1.8 是尾插法

使用HashMap怎么才能让他线程安全
使用ConcurrentHashMap,
JDK1.7的是分段数组,有Segment锁(继承于ReentrantLock)加速一小段保证并发
JDK1.8 是和HashMap一样了,数组+链表(或者红黑树)
Synchronized(锁)and CAS(compare and swap)
(JVM在1.6对Synchronize的优化很好)
CAS通俗易懂,比较并替换
(CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做)
(无锁化的修改值的操作,他可以大大降低锁代理的性能消耗。这个算法的基本思想就是不断地去比较当前内存中的变量值与你指定的 一个变量值是否相等,如果相等,则接受你指定的修改的值,否则拒绝你的操作。因为当前线程中的值已经不是最新的值,你的修改很可能会覆盖掉其他线程修改的结果。这一点与乐观锁,SVN的思想是比较类似的)

使用HashTable(基本是废弃的)
HashTable就是把HashMap套上了一个Synchronized

Collections.synchronizedMap()包装
使用synchronized 加上,但是这个是对某个Hash桶(数组的某个值)加锁,并不是整个map加锁,在锁定的时候别的线程也可以进行访问

Java中HashMap原理相关推荐

  1. java基础--java中HashMap原理

    java中HashMap原理 内推军P21 P22 1.为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射HashMap采用了数组和链表 ...

  2. Java中HashMap底层实现原理

    Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析 这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap ...

  3. Java基础-hashMap原理剖析

    Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...

  4. java lock的原理,Java中Lock原理探究

    在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...

  5. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  6. Java中HashMap的常用操作

    Java中HashMap的常用操作 HashMap<Integer, Integer> hashMap = new HashMap<>();hashMap.put(5, 2); ...

  7. java中hashmap遍历

    java中hashmap遍历有两种方法,第一种就是将所有的key放到set中,然后通过遍历set通过key来获取value,可以选择使用迭代器遍历也可以使用增强for来遍历,第二种可以使用entrys ...

  8. Java中HashMap的原理

    HashMap的工作原理 HashMap基于hashing原理,Java中的HashMap是以键值对(key-value)的形式存储元素的,我们通过put()和get()方法储存和获取对象.HashM ...

  9. Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. React 项目--引入bebal 解析JSX(5)
  2. 2014年3月视频网站微博报告
  3. 一款插件如何让Github变得不一样?
  4. java行转列_Java后端面试标准:如何准备一场后端面试?
  5. 说透Applet的数字签名之2——数字签名
  6. Debug与Release版本的区别详解
  7. 阵列信号处理知识点合集
  8. 基于Nginx日志的自动封异常ip和解封脚本
  9. 在我们人生的大道上,肯定会遇到许许多多的困难。但我们是不是都知道,在前进的道路上,搬开别人脚下的绊脚石,有时恰恰是为自己铺路?
  10. Cassandra Cql
  11. Mac电脑使用:Mac电脑如何用自带的Safari浏览器,一键翻译英文网页为中文网页
  12. 楚留香获取服务器信息未响应,楚留香手游后期输出乏力解决方法分享
  13. phpfpm怎么连接mysql_配置nginx、mysql、php-fpm的方法
  14. 黎想首次公开发布微信公众号运营的23条黄金法则,缺一不可!
  15. Web中常用字体介绍
  16. PHP最常用的几种设计模式
  17. k8s 日志收集工具 (fluent operator)
  18. 怎么解析Json数据,然后把解析到的Json数据填充到布局中?
  19. 元宇宙,会成为下一代互联网的主场吗?
  20. 关于编号/编码命名的问题

热门文章

  1. ORACLE RAC运行在300G内存以上需要考虑的东西
  2. 沃兹批评苹果避税:纳税还不如我积极
  3. 在网页浏览器中原生显示PDF文件
  4. 软件以人为本1 - 序 - 写于上海2011 ScrumGathering会后
  5. 30件你不知道可以通过Internet来办到的事
  6. 用Redis实现Session功能
  7. 前端开发 V8引擎是什么?
  8. IMAXB6充电器使用教程
  9. VS2017控制台打印问题
  10. python两组数的差异 pca_python – scikit KernelPCA不稳定的结果