Java 对集合使用我自己的equals方法

Java 对集合使用我自己的equals方法,java,overriding,equals,Java,Overriding,Equals,所以我试图重写equals(),这样当我创建一组对象时,它将正常工作 下面是我正在使用的代码(暂时忽略类型安全) 您可以假设只有一个属性,它是一个类似int的基本类型 但是,如果我将两个相同的对象添加到一个集合中,它们都会被添加。这是因为您违反了: 请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,该约定规定相等的对象必须具有相等的哈希代码 如果没有为相等对象返回相同值的hashCode实现,哈希集通常会将具有不同哈希代码的对象视为不同的对象,

所以我试图重写equals(),这样当我创建一组对象时,它将正常工作

下面是我正在使用的代码(暂时忽略类型安全)

您可以假设只有一个属性,它是一个类似int的基本类型


但是,如果我将两个相同的对象添加到一个集合中,它们都会被添加。

这是因为您违反了:

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护
hashCode
方法的一般约定,该约定规定相等的对象必须具有相等的哈希代码

如果没有为相等对象返回相同值的
hashCode
实现,哈希集通常会将具有不同哈希代码的对象视为不同的对象,除非存在哈希冲突


一旦你为你的类实现了
hashCode
,问题就会解决。

你的类必须重写
等于
hashCode

从现场

不包含重复元素的集合。更正式地说,设置 不包含一对元素e1和e2,使得e1.equals(e2)和at 大多数情况下只有一个空元素。正如其名称所暗示的那样,该接口建模 数学集合抽象

Set接口除了这些规定之外,还添加了其他规定 继承自集合接口,在所有 构造函数和关于add、equals和hashCode的契约 方法

要覆盖这些方法,可以执行以下操作:

public class Person {
    private String name;
    private int age;
    // ...

    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
            // if deriving: appendSuper(super.hashCode()).
            append(name).
            append(age).
            toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
       if (!(obj instanceof Person))
            return false;
        if (obj == this)
            return true;

        Person rhs = (Person) obj;
        return new EqualsBuilder().
            // if deriving: appendSuper(super.equals(obj)).
            append(name, rhs.name).
            append(age, rhs.age).
            isEquals();
    }
}

如果您实现如下所示的hashCode()方法,它将很好地工作

public int hashCode(){
    return this.property.hashCode();
  }
请注意,当覆盖对象类的equals方法时,必须覆盖对象类的hashcode方法


在给定集合的add方法调用期间,首先调用hashCode方法-一旦它们(如电话目录索引)相同,就会检查equals方法。

我认为您不需要
MyClass myObject2=(MyClass)这个。你可以去掉这一行,在if语句中使用
myObject1.property==this.property
。我必须将Dasblinkenlight标记为正确,因为他先回答了,但我也感谢你的帮助@BenArnao不必担心!谢谢你的投票:)
public int hashCode(){
    return this.property.hashCode();
  }