在阅读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工作的集合才会调用】