发表于: 2018-02-04 23:43:50

1 830


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

1.HashMap

(1)基于Map接口的实现,存储键值对时使用HashMap

特点:键值可以为空,非同步的,HashMap存储着Entry(hash,key,value,next)对象

(2)工作原理

通过hash的方法,通过put,get存储获取对象。

1⃣️存储对象的时候,将K/V传给put以后,调用hashCode计算出hash,然后再通过hash值得到bucket的位置,进一步存储。HashMap会更加bucket的占用情况自动调整容量。

*****超过Load factor是则resize为原来的2倍。

2⃣️获取对象的时候,我们将K传给get,调用hashCode计算出hash,然后再通过hash值得到bucket的位置,并进一步调用equals()方法确认键值对。

如果发生碰撞,HashMap将通过链表把产生碰撞的元素组织起来。

而在Java8以后,如果bucket中碰撞元素超过某个限制(八个),则使用红黑树替换链表,从而提高速度。

(3)get,put原理,以及hashCode,equals()的作用

通过key的hashCode进行hashing,并计算出下标(n-1 & hash),从而获得buckets的位置。

key.equals()就是在产生碰撞以后,去链表或树中查找相应的节点

(4)HashMap的实现

通过hashCode的高16位异或低16位实现的

(h = k.hashCode()) ^ (h >>> 16)

从速度、功效、质量考虑

(5)如果HashMap的大小超过负载因子定义的容量。怎么半?

超过了Load factor (0.75) * Capacity后,就resize一个原来长度2倍的HashMap,并调用hash方法。


明天计划的事情:(一定要写非常细致的内容) 

继续看书


遇到的问题:(遇到什么困难,怎么解决的) 


收获:(通过今天的学习,学到了什么知识)


返回列表 返回列表
评论

    分享到