黑马程序员--hashCode引发的内存泄漏

hashCode方法的作用:当有一个对象要存入hash集合的时候,JVM首先会调用 hashCode方法获取该对象的哈希值,然后根据哈希值找到相应的存储区域,最后取出该区域的所有元素与该对象进行equals比较,如果相等,不存入 该元素,否则,存入。这样不用遍历集合中的所有元素就能的到我们想要的结果,提高了查找的效率。但是如果不覆写hashCode方法的话,相同的对象可能 会存储在HashSet集合中,虽然他们equals比较相同,但他们的内存区域不同的话,就不会进行equals比较了。为了让两个相同的对象存入同一 块区域,Java中有一种规定:只要这两个对象的equals比较相同,那么他们的hashCode也应该相同。覆写hashCode方法的前提是该对象 存入的集合是hash集合,否则的话,hashCode方法就没有价值,hashCode方法也可能造成内存泄露,如果一个对象已经存入了hashSet 集合中,就不能修改那些参与计算哈希值的字段了,否则的话,修改后的哈希值与原来的哈希值就不相同了,这样再使用equals方法比较的时候,就找不到原 来的那个对象了,从而无法删除hashSet中的这个元素,最终造成了内存泄露。

class HashCode{  

public static void main(String [] args){   

Collection collection = new HashSet();   

Person person1 = new Person("zhangsan",24);   

Person person2 = new Person("lisi",25);   

Person person3 = new Person("zhangsan",24);  

 collection.add(person1);   

collection.add(person2);   

collection.add(person3);   

collection.add(person1);

  System.out.println(collection.size());

 } }

输出的结果是3,因为Set集合中不能有重复的元素。

但我们注意,person1和person2这两个对象本来是相同的,但由于Person类中没有覆写equals方法,这两个对象就不同了,

所以,以后只要hash集合,我们就应该覆写equals方法和hashCode方法,,但如果值覆写了equals方法,上面的结果有可能是2, 也可能是3,由于没有覆写hashCode方法,将person3加入到Hashset集合中的时候,JVM调用hashCode方法获取到的哈希值可能 相等,也可能不相等,由于equals是相等的,所以如果哈希值相等的话,说明这两个对象存储在同一块区域中,结果为2,如果不相等,说明这两个对象存储 在不同的区域中,equals在该区域中没有找到相等的对象,所以结果为3,

转载于:https://www.cnblogs.com/xietianhang/p/4993094.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值