import java.util.HashSet;
import java.util.Iterator;
class R {
int count;
@Override
public String toString() {
return "R [count=" + count + "]";
}
public R(int count) {
this.count = count;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj != null && obj.getClass() == R.class) {
R r = (R) obj;
if (r.count == this.count) {
return true;
}
}
return false;
}
public int hashCode() {
return this.count;
}
}
public class JiHeDemo {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new R(5));
hs.add(new R(4));
hs.add(new R(3));
System.out.println(hs);
// 取第一个元素
Iterator it = hs.iterator();
R first = (R) it.next();
first.count = 3;
System.out.println(hs);
hs.remove(new R(3));
System.out.println(hs);
System.out.println("是否包含count为3的对象" + hs.contains(new R(3)));
System.out.println("是否包含count为5的对象" + hs.contains(new R(5)));
}
}
当将第一个元素改为3时,集合中的一三元素完全相同,这表明这两个元素已经重复,但是HashSet把它们两个添加到不同的地方,因此HashSet完全可以容纳两个相同的元素。
此时HashSet比较混乱当试图删除count值为3的R 对象时,HashSet会计算出该对像的HashCode值从而找到该对象储存在HashSet中的位置,然后把此处的对象与count为3的R对象通过equals方法比较,如果相等,则删除该对像--HashSet只有第三个满足该条件(第一个元素hashCode值为5)。至于第一个count为3的对象,它保存在count为5的R对象对应的位置,但使equals方法拿它和count为5的R对象比较时返回的是false--这将导致HashSet不能准确的访问该元素。
网友评论