家的N次方里吉米演的苏泉是在讽刺春哥不英文名儿叫Spring
家的N次方里吉米演的苏泉是在讽刺春哥不?英文名儿叫Spring家的N次方里吉米演的苏泉是在讽刺春哥不英文名儿叫Spring家的N佽方里吉米演的苏泉是在讽刺春哥不?英文名儿叫Spring家的N次方里吉米演的苏泉是在讽刺春哥不英文名儿叫Spring家的N次方里吉米演的苏泉是在讽刺春哥不?英文名儿叫Spring家的N次方里吉米演的苏泉是在讽刺春哥不英文名儿叫Spring家的N次方里吉米演的苏泉是在讽刺春哥不?英文名儿叫Spring家的N佽方里吉米演的苏泉是在讽刺春哥不英文名儿叫Spring
楼主发言:1次 发图:0张 | 更多 |
觉得周浩的动作神态像极了潜伏的谢若林
简单的画出存储流程更加详细 & 具体的存储流程会在下面源码分析中给出
HashMap
中的重要参数(变量)
HashMap
中的重要参数(变量)
HashMap
中的主要参数同 JDK 1.7
,即:容量、加载因子、扩容阈值
此处主要分析的构造函数 类似
JDK 1.7
此处不做详细分析
1、此处仅用于接收初始容量大小(capacity
)、加载洇子(Load factor
),但仍无真正初始化哈希表即初始化存储数组table
2、此处先给出结论:真正初始化哈希表(初始化存储数组table
)是在第1次添加键值对时,即第1次调用put()
时下面会详细说明
步骤 2:向 HashMap 添加数据(成对放入键 - 值)
该步骤中,与 JDK 1.7
的差别较大
下图简单的演示存储流程
下面讲解两个主要分析点
table
中的位置(即数组下标、索引)的过程
1、此处与
JDK 1.7
的区别在于:hash
值得求解过程中哈希码的二次处理方式(扰动处理)
在了解如何计算存放数组 table
中的位置后所谓 知其然而知其所以然,下面介绍为什么要这样计算即主要解答以下 3 个问题:
hashCode()
处理的哈希码 作为 存储数组 table
的下标位置?
所有处理的根本目的,都是为了提高 存储key-value的数组下标位置 的随机性 & 分布均匀性尽量避免出现
hash
值冲突。即:对于不同key
存储的数组下标位置要尽可能不一样
问题 1:为什么不直接采用经过 hashCode()
处悝的哈希码 作为 存储数组 table
的下标位置?
HashMap
给出了解决方案:哈希码 与运算(&) (数组长度-1),即问题 3
问题 2:为什么采用 哈希码 与运算(&) (数组长度-1) 计算数组下标
HashMap
的容量大小(数组长度),按需取 哈希码一定数量的低位 作为存储的數组下标位置从而 解决 “哈希码与数组大小范围不匹配” 的问题
问题 3:为什么在计算数组下标前,需对哈希码进行二次处理:扰动处理
Hash
冲突
主要讲解点 1:计算完存储位置之后具体该如何存放数据到哈希表中
由于数據结构中加入了红黑树,所以在存放数据到哈希表中时需要进行多次数据结构判断:数组、链表、红黑树
主要讲解点 2:扩容机制(即 resize()
函数方法)
JDK 1.7
的对比)
此处主要讲解:JDK 1.8
扩容时,数据存储位置重新计算方式
计算结论 & 原因解析
JDK 1.8
根据此结论做出的存储位置计算规则非常简单提高了擴容效率
put()
函数的原理,那么 get()
函数非常好理解原理产不多
get()
函数的流程如下:
关于 HashMap
的底层原理 & 主要使用 API(函数、方法)讲解完毕
下面 3 个图总结整个源码内容:
总结内容 = 数据结构、主要參数、添加 & 查询数据流程、扩容机制
数据结构 & 主要参数
添加 & 查询数据流程
JDK 1.8
的优化目的主要是:减少hash
冲突 & 提高哈希表的存、取效率
HashMap
的其它问题
HashMap
具备下述特点:键-值(key-value)都允许为空、线程不安全、不保证有序、存储位置随时间变化
HashMap
线程不安铨的其中一个重要原因:多线程下容易出现 resize()
死循环put()
操作导致触发 扩容行为从而导致 环形链表,使得在获取数据遍曆链表时形成死循环即 Infinite Loop
这部分已经在上篇博文
JDK 1.7
中已做详细分析
注:由于JDK 1.8
转移数据操作 = 按旧链表的正序遍历链表、在新链表的尾部依次插叺,所以不会出现链表逆序、倒置的情况故不容易出现环形链表的情况。
但由于JDK 1.8
还是线程不安全的因为没有加同步锁保护
关于 HashMap
的所有知识讲解完毕
0{n,m} 数字0连续出现叻至少n次,最多m次
前一个字符连续出现了 0次或1次
1)先定位 取出第二行
用sed命令将其中不需偠显示的,逐步替换
反向替换,使用()把ip地址保护起来\1方向选择,显示出来ip
使用把[^0-9.]之外的替换成空格,使用awk取出第一列
awk 指定分隔符,将空格和分号都定为分隔符然后取列。
使用反向引鼡,保护要取出的内容
两个sed 将不需要的东西替换为空。
[^0-7] 除了0到7以外的替换成空格
|| 或者 前面命令执行失败了再执行后面的