java中关于哈希

来源:互联网 发布:淘宝卖家网页版 编辑:程序博客网 时间:2024/04/27 16:15

hashCode方法就是采用哈希算法存取对象的集合它内部采用对某个数字N进行取舍的方式对哈希吗进行分组和划分存储区域。当从hashset集合中查找某个对象时,java系统首先调用对象的hashCode()方法获得对象的哈希码(根据一定的算法得出一个唯一的值),然后根据哈希码找到相应的存储区域最后取出该存储区域内的每个元素与对象进行equals方法比较,这样会大大的提高查找速度,其区域分布如图


注意hashCode方法只对使用了哈希的集合有效。

如一个类的2个对象且参数分别相等,用equals方法比较的话会相等,但是如果不实现hashCode方法的话,它们的哈希值也是不相同的因为它们按照了不同的内存地址来计算hashCode值所以在哈希集合中的不同存储区域内就存在了2个一样的数据,此时推荐覆盖hashCode方法使其相等。

小提示

    通常来说,一个类的两个实例对象用equals()方法比较的结果相等时,它们的哈希码也必须相等,但反之不成立,equal()方法比较结果不相等的对象可以拥有相同的哈希码。

当一个对像被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,所以再去找这个对象的话就找不到了,同时也无法单独删除该对象,从而造成内存泄露。如

@Override

Public int  hashCode(){

final int prime=32

int result=1

result=prime=result+x

result=prime=result+y

return result

}

 //其中 xy是一个类的成员变量并且参与了哈希值的运算。

 //如果我们改变了x或者y的值的话如x=8

然后再用HashSet a=new HashSet().remove(参数);

再使用a.size()方法返回集合的大小会发现和原先的一模一样,说明并为移除,它依然存在但是我们找不它了这样的次数多了就会造成内存泄露的问题。

原创粉丝点击