覆盖equals时请遵守通用约定

在阅读effective java时看到了此章,对equals和hashcode做一下回忆。

--问题: 往HashSet里添加自定义对象(仅覆盖equals)时,不过滤重复元素,即使覆盖equals也一样,并且发现覆盖了的equals根本没有调用   

研究一下hashset如何工作:

hashset往数组里存对象时,先根据hashcode的值来确定元素应该存储的位置,当set发现两个对象计算出来的值一样,说明他们hashcode一样,则会比较调用equals方法,返回真则认为是同一个对象,不覆盖hashcode时Object的hashcode方法返回内存编码,则很大机会返回编码不同,就直接添加元素而不执行equals。

把自定义的对象放入Hashset,为了set里对象不重复,必须

1.覆盖equals方法,保证相同对象比较内容时返回true

2.覆盖hashcode方法,保证相同内容的对象一定返回相同的hashcode   

注意:Object的hashcode方法不能保证[内容相同]的对象有相同hashcode,只是[尽量]保证不同的对象具有不同的hashcode(这是为了提高效率,减少equals的调用频率)

  

为提高效率,在保证[内容相同]的对象有相同hashcode的同时,尽量保证不同的对象具有不同的hashcode

【==不会调用自定义的hashcode方法,equals也不会,就是当使用以hash工作的集合才会调用】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值