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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敬卫 中级黑马   /  2013-2-1 20:53  /  2362 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class HasCod2 {
private int x;
private int y;

public HasCod2(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}
@Override
public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + x;
  result = prime * result + y;
  return result;
}
@Override
public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  HasCod2 other = (HasCod2) obj;
  if (x != other.x)
   return false;
  if (y != other.y)
   return false;
  return true;
}
public static void main(String[] args) throws Exception {
Collection coll=new HashSet();
HasCod2 hc1=new HasCod2(3,3);
HasCod2 hc2=new HasCod2(2,4);
HasCod2 hc3=new HasCod2(3,3);
coll.add(hc1);
coll.add(hc2);
coll.add(hc3);
coll.add(hc1);
hc1.x=8;
coll.remove(hc1);
System.out.print(coll.size());
}
}张老师说,当你修改hc1指向的对象的x值时,hc1的hashcode值又存在了另一个区域中,你删hc1的时候他找不到原来的hc1,所以打印结果是2.我想问的是:你既然修改了hc1的x值,那hc1自然也就会指向这个新的对象,他要删除,也只能找修改后的新区域的元素,怎么还会去找原来区域中的元素删呢?不知大家是怎么理解的

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
我的理解是: HashSet是根据对象的hashcode去对应的区域去找元素。
也就是说,每次要查找一个元素,他会先得到该元素的hashcode值,
然后到对应的区域去寻找,当修改了元素的内容,HashSet再根据新的hashcode去查找元素,
就可能要到新的区域去找了,当然找不到了。并不是说hashcode指向了对象,
hashcode只是一个依据。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
我的理解是:
hashcode即哈希吗,就是所谓的哈希函数,在构成哈希函数的时候,如果用到了你所修改的变量,那么经过你的哈希函数推算出的值就改变了
哈希表中存放着你所存放的元素,如果经过哈希函数算出来的值改变了,那么你所算出来的地址就相应的改变了,就找不到本来想找的那个元素了
回复 使用道具 举报
从原理上来说:hash集合要删某个元素时,他会计算出该元素的hashcode值,再根据这个值到相应的区域去找有没有这样的hashcode值,如查有存在这样的值,就把该元素删除。当元素的成员变量参与了hashcode的运算时,元素每次改变员成变量值时,算出来hashcode的值也会跟着改变,所以再拿元素当前的hash值去找,当然找不着了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马