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