【面试一个个啃】Java面试:Java基础面试 :hashcode存在的意义是啥?

问:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章