HashMap、HashTable、ConccurentHashMap
HashMap(Java8以前):数组和链表
HashMap(Java8之后):数组和链表和红黑树,转为红黑树的条件是:1.链表长度到8 ,2.数组长度到64
HashMap:put方法的逻辑
HashMap:如何有效减少碰撞?
扰动函数:促使元素位置分布均匀,减少碰撞机率
使用final对象,并采用合适的equals()和hashCode()
hash值运算过程:
先将hashCode左移16位,高位和低位进行异或,再与(n-1)
与(n-1)的操作和%len的操作结果一致,但更为高效
HashMap:扩容的问题
多线程环境下,调整大小可能会存在条件竞争,容易造成死锁
rehashing(将旧hash放到新hash中)是一个比较耗时的过程