第一部分:关键源码讲解

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. 2018/7/31-zznu-oj-问题 F: 手机密码--【裸dfs+for循环即可!——据说三个小时内只有两个人读完了题意并轻松AC了】

    问题 F: 手机密码 时间限制: 1 Sec  内存限制: 128 MB提交: 41  解决: 23[提交] [状态] [讨论版] [命题人:admin] 题目描述 手机安全问题是大家经常关心的一个问 ...

  2. 大数据之路week05--day01(I/O流阶段一 之File)

    众所周知,我们电脑中有许许多多的文件夹和文件,文件的形式也有许多不同的格式,文件夹中也可以新建文件夹的存在,也就是多层的一步一步的嵌套. 我们想要实现I/O操作,就必须知道硬盘上文件的表现形式. 而J ...

  3. 一步一步pwn路由器之rop技术实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...

  4. 洛谷P2279 消防局的设立【树形dp】

    题目:https://www.luogu.org/problemnew/show/P2279 题意:一棵树.在节点处建消防站,可以覆盖与他距离在2之内的节点.问最少要建多少个消防站,可以覆盖所有的节点 ...

  5. Codeforces Round #350 (Div. 2) A B C D1 D2 水题【D2 【二分+枚举】好题】

    A. Holidays 题意:一个星球 五天工作,两天休息.给你一个1e6的数字n,问你最少和最多休息几天.思路:我居然写成模拟题QAQ. #include<bits/stdc++.h> ...

  6. 【基础算法-ST表】入门 -C++

    前言 学了树状数组看到ST表模板跃跃欲试的时候发现完全没思路,因为给出的查询的时间实在太短了!几乎是需要完成O(1)查询.所以ST表到底是什么神仙算法能够做到这么快的查询? ST表 ST表是一个用来解 ...

  7. 001_FreeRTOS中断配置

    (一)优先级看:022_STM32中断优先级分组解析 (二)FreeRTOS的中断配置中没有处理亚优先级(响应优先级)的情况,所以只能配置成组4,16个都为抢占优先级 (三)此宏用来设置 MCU 使用 ...

  8. Axios的params与data的

    Axios发送请求时params和data的区别  https://www.cnblogs.com/cwzqianduan/p/8675356.html(copy 在使用axios时,注意到配置选项中 ...

  9. kernel namespace

    reference: https://lwn.net/Articles/531114/

  10. Visual Studio Code:使用技巧汇总

    造冰箱的大熊猫@cnblogs 2019/8/9(最后更新2019/8/11) 试用了下微软出的Visual Studio Code,哎呀,有点小惊喜 将VSC的快捷键小结一下,不定期更新 功能 快捷 ...