zoukankan      html  css  js  c++  java
  • HashCode()的作用

    在实现Hash算法的集合里面,例如HashSet,该集合不能存放相同的数据,HashSet会根据对象的equals()hashCode()方法来判断要存放的数据是否已经存在。Hash算法把HashSet划分成多个区域,每个区域就是以哈希码来作为该区域的唯一编码,而hashCode()的作用就是为某对象生成一个哈希码。Hash算法会认为如果两个对象的equals()比较后相等,那么它所对应的hashCode也应该相等,那么HashSet会从该哈希码所对应的那个区域来查找是否已经存在该对象数据,不存在则放进去。而如果只提供equals方法,不提供hashCode()方法,就算判断出两个对象引用相等,但是HashSet会在不同的区域下寻找是否有该对象,这样,HashSet会把相同的对象引用存放在两个不同的区域里面。注意:只有实现了Hash算法的集合hashCode才起作用。

    例如:Set set = new HashSet();ReflectPoint rp = new ReflectPoint(3,4);//测试对象,根据其x,y属性来算出hashCodeset.add(rp);如果现在不需要rp数据了,想从内存中删除掉该对象引用,可以用set.remove(rp);此时可以清理出内存空间。但是如果修改了hashCode生成的x,y属性:rp.x = 66;此时调用set.remove(rp);,则无法删除该对象引用,因为改变了x属性的值,其hashCode也会改变,假如本来rp对象存放在A区域里面,hashCode一变,此时set.remove(rp)会从改变后的hashCode所对应的那个区域下寻找是否存在rp对象,存在就删除,而此时并不能找到,则不能删除掉,rp对象引用还会存放在内存中,占用内存空间,不被释放,造成内存的泄露。建议:不要轻易修改用于生成hashCode的属性。

  • 相关阅读:
    java 数组
    数组(二)
    JVM内存分配策略
    JVM垃圾收集算法
    LINUX 查看硬件配置命令
    遗传算法
    svn简单使用
    Several concepts in Data Mining
    JVM判断对象存活的算法
    JVM运行时数据区
  • 原文地址:https://www.cnblogs.com/heartstage/p/3363956.html
Copyright © 2011-2022 走看看