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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 楞个里格朗 中级黑马   /  2013-9-11 22:42  /  1029 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-16 11:22 编辑

Collection.collections=new HashSet();
ReflectPoint pt1=new ReflectPoint pt(3,3);
ReflectPoint pt1=new ReflectPoint pt(5,5);
ReflectPoint pt1=new ReflectPoint pt(3,3);
collection.add(pt1);
collection.add(pt2);
collection.add(pt3);
collection.add(pt1);
//pt1.y=7
//为什么注释后size为1注释后size为2.我知道是存储原pt1的位置因为hashcode分区的原因找不到了,到底打印的是去掉的元素个数还是剩余的元素个数

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

3 个回复

正序浏览
还是我没听清视频啊、这个懂了
回复 使用道具 举报
楼上的这兄弟说了那么多,难怪都没人回了啊....

意思就是那样,你知道是因为hashcode值变了,那肯定就找不到了,为什么呢? 你可以看一眼你在类里看的重写hashcode()方法就明白了,hashcode值的计算有依赖成员变量的值,成员变量的值变了,自然,hashcode值就变了,那么程序就找不到原来的hashcode入口了,所以对象就被加进去了2次罗.

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
本帖最后由 第一印象 于 2013-9-11 23:27 编辑

对于张老师说的这个例子,我的理解是这样的:
代码我先补全
  1. Collection collections = new HashSet();
  2.                 ReflectPoint pt1 = new ReflectPoint(3,3);
  3.                 ReflectPoint pt2 = new ReflectPoint(5,5);
  4.                 ReflectPoint pt3 = new ReflectPoint(3,3);        

  5.                 collections.add(pt1);
  6.                 collections.add(pt2);
  7.                 collections.add(pt3);
  8.                 collections.add(pt1);        
  9.                 //pt1.y = 4;               
  10.                 collections.remove(pt1);
  11.                 System.out.println(collections.size());
复制代码
1.因为用的集合的实现类是HashSet,所以存入元素是根据元素的hashCode方法和equals方法来判断元素
是否相等的,所以上面新增四个元素其实就相当于是新增了pt1和pt2两个对象,打印结果与我说的是相符合的

2.新增元素后如果直接打印,集合的大小将会是2,这个第一点已经解释,没有疑问,但是新增元素后,如果先调用remove方法移除pt1,再打印这时候,元素的大小肯定是1,这个1说的是collection里面的剩余的元素的数量,这个你多加几条数据进去就知道是去掉的元素个数还是剩余的元素个数了

3.调用remove方法之前新增元素之后,如果执行pt1.y=4,也就是我代码里的这个注释部分解开注释的话,移除后的大小还是2,也就是说集合中的元素没有被移除,这是因为我们新增元素时,是调用的hashCode和equals方法确定一个对象是否存在于集合中,删除时同样会调用这两个方法来获取这个需要被删除的对象,但是删除之前,我们对这个已经参与了hashCode和equals方法运算的元素y的值进行了改变,这时候,删除的方法就会找不到这个对象,这个对象就不会被删掉了,所以打印的结果是2,也就是说元素没有被移除掉

4.你还可以做一个实验,将pt1.x和pt1.y的值都改成5,也就是跟pt2这个对象的值一样了,这样的话,你调用移除的方法会移除pt2这个对象,打印的结果为1,说明确实被移除了

5.如果经常做这样的操作,就是说添加了一个对象后,又去改变这个对象中参与了hashCode和equals方法运算的属性,然后再去移除,会导致对象移除不掉,继而导致内存溢出,Hash表都有这问题,我有一次在面试过程中就被问到过,哈希表什么时候会出现内存溢出的情况

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马