Есть два набора, которые имеют один и тот же элемент.
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??
метод containsAll возвращает false, когда на самом деле наборы идентичны?
Я прочитал ответы на похожие вопросы одиниз которых HashSet содержит проблему с пользовательскими объектами , HashSet содержит метод, странное поведение , и я понимаю, как работает HashSet.Вы вычисляете хеш для сегмента и затем ищите объект, используя переопределенный метод 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;
}
}
Входные данные для hashCode ифункции равенства (как показано выше) одинаковы, функции являются детерминированными, поэтому, почему это происходит?Определенно нет способа изменить объекты Activity, поскольку я явно сделал их неизменными.Так что я совершенно растерялся из-за того, почему это происходит.
Заранее благодарен за любую помощь.