w*********n 发帖数: 439 | 1 根据JAVA的规定,Set中的元素是不可重复的。是否重复是由Set中元素equals()方法决
定。
我现在有一个Turtle类:重写了equals方法:
class Turtle{
int size;
public Turtle(int s){
size = s;
}
@Override
public boolean equals(Object o) {
return size== ((Turtle)o).size;
}
}
如果我写了向Set里面加入Turtle对象的话。应该有几个元素?
HashSet t = new HashSet();
t.add(new Turtle(1));
t.add(new Turtle(2));
t.add(new Turtle(1));
答案是3个,我的问题是第一个Turtle对象(new Turtle(1)) 和第3个Tut
le对象重复了t.add(new Turtle(1))?怎么还能加进去? |
c********w 发帖数: 308 | |
w*********n 发帖数: 439 | 3 问题是我如果不重写hashCode()为什么是3个不同对象? |
c********w 发帖数: 308 | 4 应为放进去时候看hashcode. 默认的实现是
对象内存地址,显然不一样,所以都放进去了。
【在 w*********n 的大作中提到】 : 问题是我如果不重写hashCode()为什么是3个不同对象?
|
H****S 发帖数: 1359 | 5 取决于你是放的hashset还是treeset,前者需要override hashCode,后者需要
implement Comparable interface
【在 w*********n 的大作中提到】 : 根据JAVA的规定,Set中的元素是不可重复的。是否重复是由Set中元素equals()方法决 : 定。 : 我现在有一个Turtle类:重写了equals方法: : class Turtle{ : int size; : public Turtle(int s){ : size = s; : } : @Override : public boolean equals(Object o) {
|
w****6 发帖数: 796 | 6 if hashset:
两步:
1)hashCode(), then
2)equals()
建议都一下<>:
hashCode() and equals() 必须同时 override and in sync
if treeset:
参见 HoboCS (Kane) |
f*******n 发帖数: 12623 | 7 只要两个东西是equals的,就必须有一样的hashCode。你违反了这个规矩。 |
l****u 发帖数: 1764 | 8 没有重载hashCode()的话就默认用Object的hashCode(),这个函数每个对象返回一个不
同的code。你的两个new Turtle(1)的hashCode也是不同的,所以被当做不同的对象可
以共存于一个Set里面了
HashSet判断是否重复的依据是:如果hashCode相同,继续判断equals()是否为true,
true则两个object相同,false则不同;如果hashCode不同,直接跳过equals()函数,
这俩obj不同 |
|