中易网

求解java中重写hashcode和equals的问题

答案:3  悬赏:40  
解决时间 2021-01-10 21:50
求解java中重写hashcode和equals的问题
最佳答案
楼上说的还可以,不过hashcode和equels的的重载并不是必要的!

而如果你重载了equels方法,则一定要重载hashcode方法,否则将会违反equels方法的第二条约定(相等的两个对象,散列值必然相等)。equels的三条约定请参阅《Effective Java》。

注:散列值(hashcode)相同的对象,不一定相等。

HashMap会将hashcode相同的键放在同一个散列桶中。意味着,若要在HashMap中查找一个键值,先会通过hashcode去快速达到某个散列桶,然后用equels方法逐个比较桶中的元素。直到找到该键值为止!

也就是说,有以下两种极端:
1.你定义的非常好,每个键对象都有不同的hashcode。那么Map的get方法,所花的期望时间是根号n的时间复杂度。十分快!
2.你定义所有的键对象都拥有同一个hashcode。(这并没有违反equels的约定,相等的对象,散列值相等!)此时,HashMap把所有的键对象放到同一个散列桶中,get方法的时间复杂度将会达到n平方。退化成了一个链表。

说的不对的地方请指正,也多包涵!
也可参见《Effective Java》 第8条,第9条,以获得更详尽的回答!

请采纳!参考资料:Effective Java 第8条,第9条
全部回答
为了避免存放的数据或对象相同,也就是说为了避免重复数据
hashMap是根据你写的hashCode这个方法生成哈希码来快速索引key值,某些HashMap的实现中,还用生成的哈希码来决定其存储位置。所以,作为key的对象必须重写hashCode方法,特别是自己建立的对象,如果用string来做key的话就不用了,因为String对象本来有已经重写了hashCode方法。
在HashMap中不能存在两个相等相同的key,这个相等用什么来判断呢?如果你没有重写equals方法,则不能判断两个key相不相等。所以还要重写equals方法。
你去看一下hashMap的实现方面的文章,应该会更清楚一些。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
九州旅游(仙桃一店)地址在哪,我要去那里办事
有什么方法擦镜子不花?f擦镜子老是花掉?
jquery ajax 默认超时时间是多少毫秒
一帆电脑地址在什么地方,想过去办事
想想TI3决赛A队是怎么赢的,dota是推塔游戏
哪个名字好听
染发中间要隔多久再染不会对头发太多伤害?
织梦仿站工具哪个的方便使用?
破坏我家座搞我老婆我非杀不可
2018年2月8号下的逮捕,怎么现在7月18号了还
中超目前可以签多少了外援
谁言天地宽的上一句是什么
管道法门没箭头怎么装
激素之类的食品,饮料吃多喝多会有什么危害
盆栽牡丹花可以用人畜粪浇吗
推荐资讯
很多年前在春节联欢会上宣布结婚的是谁
我身高1米63体重92斤腰围62厘米,肥吗
怎样的旗袍算是合身的
谁有qq群啊,把群号留一下
荣威350 1.5正时怎么对
双色球 大乐透 我都买了四年之久了 最多中10
ULN2004A是什么
炫舞扇子舞女的头型是什么
清朝的“太仆寺”相当于现在的什么机关?
郭晋安演阿旺的那部电影是什么?
脚被人踢中后,一走路大腿与小腿的连接处就会
围棋的等级水平是怎样区分
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?