HashCode,equals()与hashCode()

Set集合是不能重复的,如果一个存了10000个元素的set集合,要往里面再存一个元素,就需要和其他10000个元素

分别比较一遍,没有相同的了再存入。太耗费时间了。

这时候,发明了HashCode,把每一个元素计算出一个HashCode值,相同的值存到同一区域。以后只需要在这个小范围的

区域里面比较就可以了。在这个相同HashCode值的区域里比较就需要equals()方法了

如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”


为什么重写了 equals(),还要重写hashCode()?

       

重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址.
如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆

当一个对象存入一个HashSet集合中去了,就不能再修改集合中这个对象参与计算的值了。否则对象修改后的HashCode值就与最初存进集合时的hashCode的值不同了。这时候,在集合中使用该对象的当前hashCode值去找这个对象,将找不到它。同样的,删除这个对象也无法删除,这时就是内存泄漏了。如果一直这样不断的增加对象,修改对象,再删除对象,最后就内存溢出

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值