黑马程序员技术交流社区

标题: 关于哈希元素的删除的疑问? [打印本页]

作者: 李敬卫    时间: 2013-2-1 20:53
标题: 关于哈希元素的删除的疑问?
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自然也就会指向这个新的对象,他要删除,也只能找修改后的新区域的元素,怎么还会去找原来区域中的元素删呢?不知大家是怎么理解的

作者: 黑马张英涛    时间: 2013-2-1 21:14
我的理解是: HashSet是根据对象的hashcode去对应的区域去找元素。
也就是说,每次要查找一个元素,他会先得到该元素的hashcode值,
然后到对应的区域去寻找,当修改了元素的内容,HashSet再根据新的hashcode去查找元素,
就可能要到新的区域去找了,当然找不到了。并不是说hashcode指向了对象,
hashcode只是一个依据。
作者: 孔斌    时间: 2013-2-4 13:14
我的理解是:
hashcode即哈希吗,就是所谓的哈希函数,在构成哈希函数的时候,如果用到了你所修改的变量,那么经过你的哈希函数推算出的值就改变了
哈希表中存放着你所存放的元素,如果经过哈希函数算出来的值改变了,那么你所算出来的地址就相应的改变了,就找不到本来想找的那个元素了
作者: 谢洋    时间: 2013-2-4 16:09
从原理上来说:hash集合要删某个元素时,他会计算出该元素的hashcode值,再根据这个值到相应的区域去找有没有这样的hashcode值,如查有存在这样的值,就把该元素删除。当元素的成员变量参与了hashcode的运算时,元素每次改变员成变量值时,算出来hashcode的值也会跟着改变,所以再拿元素当前的hash值去找,当然找不着了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2