第一部分:关键源码讲解

1.HashMap  是如何存储的?

a.底层是一个数组 tab

b. hash=hash(key) ,然后根据数组长度n和hash值,决定当前需要put的元素对应的数组下标,

hash算法见红框。

 

2.数组长度是固定的,HashMap 可以无限put(k,v) ,为什么?

HashMap  的元素个数大于threshold的时候,会进行resize() 扩容

 

3.如何实现扩容的?

扩容就是通过 resize() , 重新创建一个新数组,对所有元素rehash,放到新数组相应位置。

扩容代价是很大的,所以很多公司编码规范都有一条,合理设置hashMap的InitialCapicity,

禁止直接用HashMap()

 

4.Hash 冲突是什么?怎么解决这个问题?

Hash 冲突: 假如一个学校有366个同学,一年365天,那么至少有两个同学是同一天生日,这就是hash冲突。用代码来说,不同的key 经过计算p = tab[i = (n - 1) & hash] 对应同一个p

如何解决:

p在有的翻译文档中叫桶,一个桶可以装多个,怎么装? 链表或者红黑树。

 

以上代码中 else if 部分是红黑树

else 部分是链表 ,链表中如果冲突元素个>=TREEIFY_THRESHOLD-1,会将链表转换成红黑树。

因为元素个数很多时,红黑树比链表性能更好。

5.HashMap 是不是线程安全的,如何解决线程安全问题?

 

答案是NO,如何解决:

a.对整个map加锁。

b.直接用ConcurrentHashMap

 

对f加锁了,就是对桶加锁,就是传说中的分段锁机制。

在保证安全的前提下,加锁的范围越小,则程序性能越高,自己写代码时切记胡乱在方法上加synchronized

6.HashMap 和 hash()  equals() 方法的关系

面试中面试官会问重写equals()方法要注意是什么,答案是hash()也要重写。

不重写会引起HashMap 等集合类使用的混乱。

 

比如类Person(id,name),重写了 equals(Object obj){... reutrn this.id==obj.id},没有重写hash(), 那么从类定义上来说,只要id相等就是同一个人,当我们Person作为key,放入两个Person对象(id相等)到HashMap的时候,那么就翻车了,HashMap 会有两个元素,而我们期望的只保留一个。

第二部分:实验验证

1.验证ConcurrentHashMap 线程安全。

 
 

2.重写equals()不重写hash() 翻车问题验证。

需要源码或者需要系列文章更新通知,请加微信 kevinzhang7234

转自: http://skycity.today/?thread-38.htm

HashMap和ConcurrentHashMap 源码关键点解析的更多相关文章

  1. HashTable、HashMap与ConCurrentHashMap源码解读

    HashMap 的数据结构 ​ hashMap 初始的数据结构如下图所示,内部维护一个数组,然后数组上维护一个单链表,有个形象的比喻就是想挂钩一样,数组脚标一样的,一个一个的节点往下挂. ​ 我们可以 ...

  2. HashMap TreeMap ConcurrentHashMap 源码

    1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...

  3. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  5. 数据结构算法 - ConcurrentHashMap 源码解析

    五个线程同时往 HashMap 中 put 数据会发生什么? ConcurrentHashMap 是怎么保证线程安全的? 在分析 HashMap 源码时还遗留这两个问题,这次我们站在 Java 多线程 ...

  6. Java之ConcurrentHashMap源码解析

    ConcurrentHashMap源码解析 目录 ConcurrentHashMap源码解析 jdk8之前的实现原理 jdk8的实现原理 变量解释 初始化 初始化table put操作 hash算法 ...

  7. JDK1.7 ConcurrentHashMap 源码浅析

    概述 ConcurrentHashMap是HashMap的线程安全版本,使用了分段加锁的方案,在高并发时有比较好的性能. 本文分析JDK1.7中ConcurrentHashMap的实现. 正文 Con ...

  8. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  9. 死磕 java集合之ConcurrentHashMap源码分析(三)

    本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样 ...

随机推荐

  1. linux加载字体

    将解压后的文件夹cp到/usr/share/fonts目录下,然后cd到/usr/share/fonts/ziti目录下执行:mkfontscalemkfontdirfc-cache 在linux,把 ...

  2. 部署kibana节点

    部署Kibana节点 1.查看系统环境: [root@Kibana ~]# hostname Kibana [root@Kibana ~]# cat /etc/redhat-release CentO ...

  3. Java锁--框架

    根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁". 同步锁 即通过synchronized关键字来进行同步,实现对竞争资源 ...

  4. 2018VUE面试题总结

      Vue面试题 一:什么是MVVM MVVM是是Model-View-ViewModel的缩写,Model代表数据模型,定义数据操作的业务逻辑,View代表视图层,负责将数据模型渲染到页面上,Vie ...

  5. Windows10关闭自动更新总结

    试过好多关闭windows自动更新的方法,但是在每次重启后发现C盘又塞了一堆更新包,强迫症的我必须要彻底关闭它! 1. services关闭 运行 services.msc ,找到Windows Up ...

  6. 基于Kinect 2.0深度摄像头的三维重建

    刚今天验收的实验,记录一下. 是比较基础的三维重建内容. 算是三维重建入门. 系统:windows 环境:visual studio 2013 语言:c++ 相关:OpenCV 2.Kinect SD ...

  7. P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图

    展开 题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可 ...

  8. UDP c/s 模型

    server.c /* udp server.c */ #include <string.h> #include <netinet/in.h> #include <std ...

  9. 【概率论】3-5:边缘分布(Marginal Distribution)

    title: [概率论]3-5:边缘分布(Marginal Distribution) categories: Mathematic Probability keywords: Marginal p. ...

  10. JavaScript中BOM的重要内容总结

    一.BOM介绍 BOM(Browser Object Model),浏览器对象模型: 用来操作浏览器部分功能的API: BOM由一系列的对象构成,由于主要用于管理窗口和窗口之间的通讯,所以核心对象是w ...