HashMap总结

作者: 桂成盛吃蝙蝠 | 来源:发表于2020-04-08 20:16 被阅读0次

    当两个不同的键对象的hashcode相同时会发生什么?
    它们会储存在同一个bucket位置的HashMapEntry组成的链表中。

    如果两个键的hashcode相同,你如何获取值对象?

    当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点。

    什么是hash,什么是碰撞,什么是equals ?

    Hash:是一种信息摘要算法,它还叫做哈希,或者散列。我们平时使用的MD5,SHA1都属于Hash算法,通过输入key进行Hash计算,就可以获取key的HashCode(),比如我们通过校验MD5来验证文件的完整性。

    对于HashCode,它是一个本地方法,实质就是地址取样运算

    碰撞:好的Hash算法可以出计算几乎出独一无二的HashCode,如果出现了重复的hashCode,就称作碰撞;

    就算是MD5这样优秀的算法也会发生碰撞,即两个不同的key也有可能生成相同的MD5。

    HashCode,它是一个本地方法,实质就是地址取样运算;

    ==是用于比较指针是否在同一个地址;

    equals与==是相同的。
    如何减少碰撞?
    使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择

    如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?

    默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

    相关文章

      网友评论

        本文标题:HashMap总结

        本文链接:https://www.haomeiwen.com/subject/uxexmhtx.html