Java HashSet包含所有未按预期工作的内容-尽管实现了hashCode和equals方法

Java HashSet包含所有未按预期工作的内容-尽管实现了hashCode和equals方法,java,methods,equals,hashcode,hashset,Java,Methods,Equals,Hashcode,Hashset,有两个集合具有相同的单个元素 Set<Activity> a = new HashSet<Activity>(); a.add(new Activity("X", 1, 2)); Set<Activity> b = new HashSet<Activity>(); b.add(new Activity("X", 1, 2)); return a.containsAll(b); //gives false?? Set,我理解HashSet的工作原理

有两个集合具有相同的单个元素

Set<Activity> a = new HashSet<Activity>();
a.add(new Activity("X", 1, 2));
Set<Activity> b = new HashSet<Activity>();
b.add(new Activity("X", 1, 2));
return a.containsAll(b); //gives false??
Set,我理解HashSet的工作原理。将哈希计算到一个bucket,然后使用重写的equals()方法搜索该对象

活动类的实现方式如下:

public class Activity implements Comparable<Activity> {
  private final double maxDuration;
  private final double normalDuration;
  private final String label;   


  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((label == null) ? 0 : label.hashCode());
    long temp;
    temp = Double.doubleToLongBits(maxDuration);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    temp = Double.doubleToLongBits(normalDuration);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    return result;
  }

    @Override
   public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      Activity other = (Activity) obj;
      if (label == null) {
        if (other.label != null)
          return false;
   } else if (!label.equals(other.label))
        return false;
    if (Double.doubleToLongBits(maxDuration) != Double
            .doubleToLongBits(other.maxDuration))
        return false;
    if (Double.doubleToLongBits(normalDuration) != Double
            .doubleToLongBits(other.normalDuration))
        return false;
    return true;
}

    public Activity(String label, double d, double e) {
      this.maxDuration = e;
      this.normalDuration = d;
      this.label = label;
}

}
公共类活动实现可比性{
私人最终双倍最大持续时间;
私人最终双倍正常期限;
私有最终字符串标签;
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((label==null)?0:label.hashCode();
长温;
temp=双倍至长位(最大持续时间);
结果=prime*result+(int)(temp^(temp>>>32));
temp=双倍至长位(正常持续时间);
结果=prime*result+(int)(temp^(temp>>>32));
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
活动其他=(活动)obj;
if(label==null){
if(other.label!=null)
返回false;
}else如果(!label.equals(other.label))
返回false;
if(Double.doubleToLongBits(maxDuration)!=Double
.doubleToLongBits(其他.maxDuration))
返回false;
if(Double.doubleToLongBits(正常持续时间)!=Double
.doubleToLongBits(其他.正常持续时间))
返回false;
返回true;
}
公共活动(字符串标签、双d、双e){
this.maxDuration=e;
此参数为d;
this.label=标签;
}
}
hashCode和equals函数(如上所示)的输入是相同的,函数是确定性的,因此为什么会发生这种情况?由于我显式地将活动对象设置为不可变的,所以绝对不可能更改它们。所以我完全不明白为什么会这样


提前感谢您的帮助。

您确定这是正确的代码吗<代码>私有最终私有字符串标签永远无法编译!它为我返回
true
。可能是你的构造函数不对。显示它。问题是不可再现的。请参阅Please post an。除了双私有=>private-final-private字符串标签之外,您的代码在这里工作得非常好;你的构造函数是对的吗?你的构造函数可以做类似于
this.maxDuration=maxDuration+Math.random()
:)