求解java中重写hashcode和equals的问题
答案:3 悬赏:40
解决时间 2021-01-10 21:50
- 提问者网友:捧腹剧
- 2021-01-10 10:08
求解java中重写hashcode和equals的问题
最佳答案
- 二级知识专家网友:未来江山和你
- 2021-01-10 11:44
楼上说的还可以,不过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条
而如果你重载了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条
全部回答
- 1楼网友:舊物识亽
- 2021-01-10 14:42
为了避免存放的数据或对象相同,也就是说为了避免重复数据
- 2楼网友:你可爱的野爹
- 2021-01-10 13:11
hashMap是根据你写的hashCode这个方法生成哈希码来快速索引key值,某些HashMap的实现中,还用生成的哈希码来决定其存储位置。所以,作为key的对象必须重写hashCode方法,特别是自己建立的对象,如果用string来做key的话就不用了,因为String对象本来有已经重写了hashCode方法。
在HashMap中不能存在两个相等相同的key,这个相等用什么来判断呢?如果你没有重写equals方法,则不能判断两个key相不相等。所以还要重写equals方法。
你去看一下hashMap的实现方面的文章,应该会更清楚一些。
在HashMap中不能存在两个相等相同的key,这个相等用什么来判断呢?如果你没有重写equals方法,则不能判断两个key相不相等。所以还要重写equals方法。
你去看一下hashMap的实现方面的文章,应该会更清楚一些。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯