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()
:)