HashMap
存储结构
hashMap的存储结构,
1.7:使用的是Entry数组+链表的形式
1.8:使用的是Node数组+链表+红黑树

定位数组索引
不管是put还是get,定位到哈希桶数组都是非常关键的一步。
HashMap定位数组索引位置,直接决定了hash方法的离散性能。先看看源码的实现(方法一+方法二):
方法一:
static final int hash(Object key) { //jdk1.8 & jdk1.7
int h;
// h = key.hashCode() 为第一步 取hashCode值
// h ^ (h >>> 16) 为第二步 高位参与运算
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
方法二:
static int indexFor(int h, int length) { //jdk1.7的源码,jdk1.8没有这个方法,但是实现原理一样的
return h & (length-1); //第三步 取模运算
}
这里的Hash算法本质上就是三步:取key的hashCode值、高位运算、取模运算。
插入方法

此处有几个小问题<

本文详细探讨了HashMap在Java 1.7和1.8中的存储结构,包括1.7的Entry数组+链表和1.8新增的红黑树。重点讲解了定位数组索引的方法及插入操作的差异,1.7先扩容后插入,1.8则先插入后根据需要扩容。此外,解释了1.8中链表转红黑树的阈值设定为8的原因,保证在大量哈希冲突时保持查询性能。
最低0.47元/天 解锁文章
2575

被折叠的 条评论
为什么被折叠?



