本帖最后由 第一印象 于 2013-9-11 23:27 编辑
对于张老师说的这个例子,我的理解是这样的:
代码我先补全- Collection collections = new HashSet();
- ReflectPoint pt1 = new ReflectPoint(3,3);
- ReflectPoint pt2 = new ReflectPoint(5,5);
- ReflectPoint pt3 = new ReflectPoint(3,3);
- collections.add(pt1);
- collections.add(pt2);
- collections.add(pt3);
- collections.add(pt1);
- //pt1.y = 4;
- collections.remove(pt1);
- 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表都有这问题,我有一次在面试过程中就被问到过,哈希表什么时候会出现内存溢出的情况
|