HashMap源码分析与实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyjava/article/details/82015008

1,HashMap

数组+链表
数组容易查询,根据下标查询(有序),链表容易插入和删除,根据指针(散列)
Hash:散列将一个任意的长度通过hash函数算法转换成一个固定值。
hash移位算法,查看源码
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Map:地图X,Y存储
总结:通过Hash出来的值,然后通过值定位到这个map,然后value存储到这个map中,HashMap基本原理
1,key可以为空吗?Null当成一个key来存储。
2,如果hash key重复了value会覆盖嘛?不会,链表方式存储,存储在首位
3,扩容因子0.75,这时候会浪费性能,resize,rehash等
面试:hashmap什么时候做扩容?put的时候高于或等于0.75.
偶数,2*16=32 初始化大小16,扩容都是乘以2

2,源码分析

1,初始化参数介绍
2,put方法分析
3,get方法分析
4,entry对象介绍
5,扩容源码分析

3,手写实现

1,定义接口map
2,实现类hashmap

4,不足之处(伸缩性)

key是否重复有关get(0)1
1,伸缩性
每当hashmap扩容的时候需要重新去add entry对象,需要重新hash,然后放入我们新的entry table数组里面。
如果工作中你知道hashmap需要存储多少值,几千或者几万的时候,最好先指定他们的扩容大小,防止在put的时候
进行再次扩容很多次。
2,时间复杂度
你的hash算法决定了你的效率。

思考:
二进制计算的一些基础知识
为什么使用 hashcode
String 类型的 hashcode 方法
为什么大部分 hashcode 方法使用 31
HashMap 的 hash 算法的实现原理(为什么右移 16 位,为什么要使用 ^ 位异或)
HashMap 为什么使用 & 与运算代替模运算?
HashMap 的容量为什么建议是 2的幂次方?
我们自定义 HashMap 容量最好是多少?

深入理解 hashcode 和 hash 算法
https://blog.csdn.net/qq_38182963/article/details/78940047

猜你喜欢

转载自blog.csdn.net/yyjava/article/details/82015008