HashSet深入

2017-04-13  本文已影响13人  李霖神谷
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不能准确的访问该元素。

上一篇 下一篇

猜你喜欢

热点阅读