码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-11-24 22:59:21      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

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,

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

标签:

原文地址:http://www.cnblogs.com/xietianhang/p/4993094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!