为什么Set允许重复?

Qua*_*yen 0 java set hashset

我有以下代码:

class Animal {
    int i;

    public Animal(){
        i=13;
    }

    public String toString(){
        return "Animal "+i;
    }
}
//
public class NewMain {
    public static void main(String[] args) {
        HashSet hs=new HashSet();
        boolean b=hs.add(new Animal());
        boolean b1=hs.add(new Animal());
        System.out.println(b+" "+b1);
        for(Object o:hs)
        {
            System.out.println(hs);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这Set不允许重复,但为什么上面的代码似乎允许两个相同的值?

SLa*_*aks 7

因为Java无法知道您的两个实例是相同的.

你需要覆盖equals() hashcode() .


Ell*_*sch 6

正如已经指出的那样,你需要覆盖hashCodeequals.你可以比较int i一下,

class Animal {
    int i;

    public Animal() {
        i = 13;
    }

    @Override
    public String toString() {
        return "Animal " + i;
    }

    @Override
    public int hashCode() {
        return Integer.hashCode(i);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Animal) {
            return ((Animal) obj).i == i;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我会建议你使用泛型Collection.此外,您应该Collection在循环中打印实例(而不是).就像是,

public static void main(String[] args) {
    Set<Animal> hs = new HashSet<>();
    boolean b = hs.add(new Animal());
    boolean b1 = hs.add(new Animal());
    System.out.println(b + " " + b1);
    for (Animal a : hs) {
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了(预期的)

true false
Animal 13
Run Code Online (Sandbox Code Playgroud)