
重写的话,自己定义当名字和年龄都相同时候
他们的值就相同,另外,返回
的哈希码也相同;
public
int
hashCode(){
return
name.hashCode^((age<<25)+(age<<17)+(age<<9)+(age))^0xabf024
}
可以这样写,总这相同名字和年龄时候返回值相同
另外的,不同时候,让他们尽量分散,不重复。
equals
的重新就比较简单了
HashSet 比较两个对象是否相同的机制是 1.hash 2. == 3.equals()第一步就是比较两个对象的hash值是否相同(注意这里的hash值是经过处理的,为了使散列更均匀)
hash值相同的就会散列到一组 不相同就会散列到不同的组(此时就不会再继续比较了,因为在不同组hashset认为他们就是不同的对象)
第二步 如果hash值相同 则进行连等判断 即比较内存地址是否相同 如果不相同那么hashset就认为他们肯定不是相同的对象 如果内存地址相等(这一步最主要的目的其实就是删除元素的时候判断)那么进行第三步
第三步 如果equals返回相同 那么他们就是彻彻底底的相同的对象 不能添加到set里,如果返回不同那么他们就不是彻底的不相同 就可以添加到一个set里
楼主明白了吧,纯手打,希望对你有帮助
报此异常是因为要添加的对象需要实现 comparable接口
并且重写comparato方法
但是往Hashset方法里添加对象元素就不需要实现comparable接口,就可以直接添加对象.因为
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)