A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© j420984 中级黑马   /  2015-6-24 10:30  /  855 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值 就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露
想请教下,哈希值是怎么得到的.计算哈希值一定要对象的某个字段参与运算吗.

7 个回复

倒序浏览
没人回答么?
回复 使用道具 举报
有点没看懂什么意思
回复 使用道具 举报
不一定,比如一个学生类,实现了好几个对象要放在hashset中,在这里元素是不能重复的。在你看来怎么样的学生是同一个,这就的看需求了。有的是姓名和年龄相同就是同一个学生;有的是姓名相同就是同一学生。因此根据需求来写你的hashcode了以及equals
回复 使用道具 举报
hashcode()方法返回的值即为哈希值,默认哈希值为对象的内存地址值,实际应用时一般需要根据自己需求重写该方法决定需要参与哈希值运算的字段。内存泄露是因为当对象存入数据结构是哈希表的集合时,以其哈希值划分内存存储区域,对象引用指向该内存区域,当对象参与哈希值运算的字段改变时,会重新确定内存位置,而引用依然指向之前存入时的内存区域,这就会发生引用找不到对象的情况,对该引用的一系列操作是无法完成的,这就是内存泄露。
回复 使用道具 举报
楼上说的很全面。我觉得,hashcode值的计算应该保证这个条件成立:
equals()方法比较结果为相同的两个对象,它们的哈希值相等。
回复 使用道具 举报
没看懂啊         
回复 使用道具 举报
太高深了,还不能理解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马