`

Hashcode作用以及hash算法的理解

阅读更多

使用HashSet可能会导致内存泄漏的原因

     * 内存泄漏: 就是当前内存中已经没有使用这个对象,但它仍然还停在内存中,没有被释放,一直占用着内存空间.

 

//equals方法默认比较的是否为同一对象的引用.

    /*哈希算法: 用来手提高从元素中查找元素的效率,将集合分成若干个区域,每一个对象都可以计算出一个hashCode,

     *         可以将hashCode分组,每一组分别对应一个存储区域.根据对象的哈希值,就可以确定对象存储在哪个区域 。

     *

     * HashSet就是采用合希算法存取对象的集合。

     * 它的内部采用了对某个数字n进行取余的方式对哈希码进行分组和划分对象存储区域,Object类中对义了hashCode()方法,用来返回每个Java对象的哈希值,

     * 当从HashSet中查找某个对象时,Java系统首先首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到对应的区域,然后取出该区域的每个对象

     * 使用equals方法进行比较,这样不用遍历集合中所有的对象就可以得到结果。可见HashSet集合有很好的对象检索性能,但是HashSet集合存储的性能要低些。

     * 因为向HashSet集合添加对象时,要先计算它的HashCode值和根据这个hashcode来确定这个对象在集合中存放的位置.

     * 为了保证一个类的实例对象在HashSet中正常存储,要求这个类的二个实例对象用equals方法比较相等时,他们的hashcode值也必须相等,

     * 也就是说 obj1.equals(obj2) ,则要有:obj1.hashCode() == cbj2.hashCode()

     *

     * 当一个对象被存放到HashSet以后,就不能再修改这个对象的那些参与计算哈希值运算的字段了.否则,对象修改后的哈希值与最初存储进HashSet时的hashcode值不

     * 再相等,在这种情况下即使在使用contains()方法使用当前对象去HashSet检索时,也将返回不同对象的结果,这也会导致无法从hashSet()中删除当前对象,从而就导致了内存泄漏

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics