HashMap全家桶
HashMap存储结构
JDK1.7中HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。在JDK1.8中,由数组和链表和红黑树组合构成的数据结构。数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。每一个节点都会保存自身的hash、key、value、以及下个节点,我看看Node的源码。
HashMap为什么线程不安全?
在JDK1.7中,HashMap采用拉链法来解决Hash冲突。PS:Hash冲突的意思是当插入的<K1,V1>和<K2,V2>,K1和K2的hashcode值相同,计算出的数组下标相同,因此会发生Hash冲突。解决方式是拉链法头插法,就是将相同的<K2,V2>插入到<K1,V1>的头部,然后将链表下移,让链表的头部和数组对齐。正是因为头插法,所以才会发生造成HashMap线程不安全。
HashMap.put()原理
- 首先计算key和hashcode值:h = key.hashcode()
- 将h与自己高16位做异或运算,目的是增加了随机性,减少了碰撞冲突的可能性