本帖最后由 Jim-剣◆﹏ 于 2013-11-29 13:59 编辑
这要看你的重写的equals是怎么实现的
你首先得明确hashSet存储去除重复元素的机制:先比较元素的hashCode,如果hashCode相同,则再比较equals,如果hashCode和equals都相同,那么这个元素就不会被添加进集合,如果hashCode不同,则不需要比较equals,直接添加进集合
ReflectPoint pt1 = new ReflectPoint(3,3);
ReflectPoint pt2 = new ReflectPoint(5,5);
ReflectPoint pt3 = new ReflectPoint(3,3,);
pt1,pt2,pt3,没有重写hashCode(),那么他们的hashCode()就是继承父类Object的hashCode()
查看源代码可以知道,父类Object的hashCode()是关联内存地址值的,而pt1,pt2,pt3这三个对象都是通过关键字new出来的,内存地址必定不一样,所以,pt1,pt2,pt3的hashCode()值也必定不一样
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
这三个可以直接添加进集合
对于再写一句collections.add(pt1);
这个当楼主你重写equals是这
- public boolean equals(Object obj){
- rerurn false;
- }
复制代码
样的时候
此时打印结果是4
当楼主你重写的equals方法关联到对象的属性值时,判断依据是对象的属性时,就不能添加进去
此时打印结果就是3
重点看你怎么实现equals方法
不过一般没人会写一个不做任何比较直接返回boolean值的equals方法,但是是存在这种可能的
--------------------------------------------------------------------------------------------------分割线
以上说法没经过实践仓促回复,后来经过验证,发现了就算在equals中直接返回一个false还是不能成功添加,打印结果还是为3
似乎java有别的机制去除重复元素,并不只是根据hashCode和equals来工作的
故另外开贴咨询大牛,详情请移步http://bbs.itheima.com/forum.php?mod=viewthread&tid=101147&page=1&extra=#pid566897
|