问:
hashcode存在的意义是啥?
面试官心里:
考察面试者研究技术的深度,探究精神很重要,这是个好问题,后续还有连环问
答:
hashcode的存在主要是用于查找对象的快捷性,如HashSet,HashMap等存储对象的结构中,hashcode是用来在hash存储结构中确定对象的存储地址的。
Java中比较两个对象是否相等,会调用object.equals方法,如果两个对象相同,那么equals相同,那么这两个对象的hashcode一定要相同。
官方api就是这么写的:
如果对象的equals方法被重写,那么对象的hashCode也要重写,equals显示对象相等,那么两个对象的hashcode必须一致。
反过来,两个对象的hashcode相同,并不一定表示两个对象就相同,也就是不一定要求equals方法返回true,只能够说明这两个对象在hash存储结构中,如Hashtable中,他们“存放在同一个桶里”。
hashcode相同如何处理?
这是个hash碰撞问题,常见有3中解决办法
1,HashMap采用的是拉链法(JDK1.8以前):
2,还有开放地址法
开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。
如果di取值可能为伪随机数列。称伪随机探测再散列
3,再hash法
当发生冲突时,使用第二个、第三个。。。哈希函数计算地址,直到无冲突
java 8有什么优化吗?
红黑树
当链表中的节点数量大于8时,转为红黑树存储有碰撞的对象值(hashmap源码)。
关键点:
1,解决二叉树极端情况下会形成链表而带来的查找效率问题
2,插入,删除都会打破平衡,通过左旋,右旋和改变节点颜色来达到自平衡
左旋:
右子节点变为父节点
右子节点的右子节点变为兄弟节点
右子节点的左子节点变为右子节点
右旋:
左子节点变为父节点
左子节点的左子节点变为兄弟节点
左子节点的右子节点变为左子节点
详细了解红黑树:
https://www.guoxiongfei.cn/cntech/8804.html