首页 > 代码库 > 黑马程序员——hashCode方法的作用,java内存泄露
黑马程序员——hashCode方法的作用,java内存泄露
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,