HashMap的源码了解

hash:散列 讲一个任意长度通过某种hash函数算出一个固定值
Java 通过移位来实现
通过hash出来的一个指,通过值定为到map,然后value存储在这个map中
源码分析:
初始化容量 1左移4位=16 hash表创建的时候加载的容量
加载因子系数: 1分成4等分 0.25 0.25*3=0.75
在容量的四分之三的时候扩容
EntryTable:
threshold扩容的时候一个入口
Holder:加载jdk找到 thresgold
put方法:
如果table是空的话就初始化,然后赋值一个null存起来
key不为空的时候:
通过四次固定的位置,产生一个比较分散的列表
hash出来的值重复了value?
当e.hash==hash&&(k=e.key)==key||key.equals(k)
先将进来的值e.value赋值给老的oldvalue
然后在将value给e.value
如果key是重复的就返回它,否则返回nullhash
hashmap什么时候扩容:put的时候 达到一个四分之三
if size>threshold并且不为空
扩大为2倍,为什么是偶数? indexof拿到hash值
resize:
先将老的entry大小进行判断,然后创建一个entry数组,然后调用transfer进行赋值
hashmap table:数组加链表
hashmap的不足的地方:
每当hashmap扩容的时候需要重新去add entry对象,需要重新hash,然后放入到我们的entrytable中
平时使用的时候知道hashmap需要多大的值,最好先指定他们的值

你可能感兴趣的:(java基础知识)