Java 如何定义我自己的元素类用于Set

Java 如何定义我自己的元素类用于Set,java,set,Java,Set,我有以下代码: public class MyElement { String name; String type; MyElement(String name, String type) { this.name = name; this.type = type; } } public class Test { public static void main(String[] args) { Set&l

我有以下代码:

public class MyElement {
    String name;
    String type;

    MyElement(String name, String type) {
        this.name = name;
        this.type = type;
    }
}

public class Test {

    public static void main(String[] args) {
        Set<MyElement> set = new HashSet<MyElement>();
        set.add(new MyElement("foo", "bar"));
        set.add(new MyElement("foo", "bar"));
        set.add(new MyElement("foo", "bar"));
        System.out.println(set.size());
        System.out.println(set.contains(new MyElement("foo", "bar")));
    }
}
我本以为结果是1并且是真的。为什么我的元素不被认为是相同的,我如何纠正这一点? 谢谢
Wayne.

您需要根据总合同在MyElement上实现
equals(Object o)
hashCode()
。如果没有,Set.contains()将使用比较对象内存地址的默认实现。由于您正在contains调用中创建MyElement的新实例,因此返回为false。

您应该重写equals(MyElement me)函数。等于返回一个布尔值

否则,您将检查两个项是否是对象的同一实例,而不是它们的内部内容是否相同

MyElement(String name, String type) {
    this.name = name;
    this.type = type;
}

public boolean Equals<MyElement>(MyElement me) {
    return this.name.equals(me.name) && this.type.equals(me.type);
}
MyElement(字符串名称、字符串类型){
this.name=名称;
this.type=type;
}
公共布尔等于(MyElement me){
返回this.name.equals(me.name)和&this.type.equals(me.type);
}

谢谢,这就成功了。我的最后一个代码是:公共类MyElement{String name;String type;MyElement(String name,String type){this.name=name;this.type=type;}public boolean equals(Object Object Object){MyElement MyElement=(MyElement)Object;返回this.name.equals(MyElement.name)&&this.type.equals(MyElement.type);}public int hashCode(){return(name+type).hashCode();}}
MyElement(String name, String type) {
    this.name = name;
    this.type = type;
}

public boolean Equals<MyElement>(MyElement me) {
    return this.name.equals(me.name) && this.type.equals(me.type);
}