3.相关面试题
1.哈希表底层采用何种算法计算hash值?还有哪些算法可以计算出hash值?
底层采用的key值的hashCode()方法的值结合数组长度进行无符号右移16位(>>>)、按位异或(^)、按位与(&)计算出索引
效率快
还可以采用:平方的取中法,取余数,伪随机数法,这些方法效率较慢
2.当两个对象的hashCode相等会怎么样?
会产生哈希碰撞,若key值内容相同则替换旧的value值
,如果不相等,在java8之后在链表中使用链头法
存储数据,如果链表的节点阈值超过八个,并且数组大于 64位,就会触发红黑树节点,使用红黑树存储
3.何时发生哈希碰撞和什么是hash碰撞,如何解决hash碰撞?
只要两个元素的key键值计算的哈希码值相同
就会发生哈希碰撞,jdk8前使用链表
解决hash碰撞,在java8之后使用链表+红黑树
解决hash碰撞
4.如果两个键的hashcode相同,如何存储键值对?
hashcode相同,通过equals比较内容是否相同
相同:则新的value覆盖之前的value
不相同:则将新的键值对添加到哈希表中