Java中hashmap的原理

是什么

hashmap底层是由哈希表组成,用于存储键值对的,其核心就是将哈希值映射到数组索引位置上,通过数组+链条的方式来解决哈希冲突,java8之后优化成数组+链条+红黑树。

存放

hashmap的哈希值由hashcode方法来进行计算,确定存储在数组上的位置,哈希值进过计算之后可能会重复,此时直接加在链表上即可,防止冲突分布不均。

扩容

hashmap的数组默认长度是16,负载因子是0.75,当大于16*0.75的数组长度时,会自动扩容,不过扩容也是会比较耗时的,数组长度*2,链表不会一直加很长,链表长度大于8会转换成,红黑树来优化链表都查询效率,提高性能。


hashmap的红黑树优化

hashmap中当链表长度大于8时,会自动转换成红黑树,红黑树是一种自平衡二叉树搜索树,能够将最坏情况下的搜索效率从O(n)转换到O(logN)

如果红黑树的元素小于6时,会自动转换成链表结构,已减少不必要的开销。


hashmap中的hashcode()和equals()的区别

首先hashcode是用来计算哈希值的,哈希值来确定存放位置,多个数值对应的哈希值可能一样。

equals是用来对比两个值是否一样

当两个值的经过equals方法返回true,则他们的哈希值也一定相同,当两个值经过hashcode方法返回true,只是表明两个值的存储位置相同,存放在一个哈希桶中,不代表值相同


默认容量和负载因子的选择

hashmap的默认容量是16,负载因子是0.75,当数组存储数量大于16*0.75时会扩容,有一定的性能消耗,默认容量越大,哈希冲突越小,反之,负载因子如果是1时,可能会造成哈希冲突变大,但是扩容的次数会减少。

你可能感兴趣的:(笔记,学习,java,经验分享)