diff --git a/java/basis/hashmap.md b/java/basis/hashmap.md index a3ad434d..6946ba78 100644 --- a/java/basis/hashmap.md +++ b/java/basis/hashmap.md @@ -326,7 +326,7 @@ final Node[] resize() { 是基于Map接口的实现,存储键值对时,它可以接收null的键值,是非同步的,HashMap存储着Entry\(hash, key, value, next\)对象。 **2. 你知道HashMap的工作原理吗?** -通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量\(超过`Load Facotr`则resize为原来的2倍\)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals\(\)方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制\(默认是8\),则使用红黑树来替换链表,从而提高速度。 +通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量\(超过`Load Factor`则resize为原来的2倍\)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals\(\)方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制\(默认是8\),则使用红黑树来替换链表,从而提高速度。 **3. 你知道get和put的原理吗?equals\(\)和hashCode\(\)的都有什么作用?** 通过对key的hashCode\(\)进行hashing,并计算下标\( `(n-1) & hash`\),从而获得buckets的位置。如果产生碰撞,则利用key.equals\(\)方法去链表或树中去查找对应的节点