HashSet содержит все не работает должным образом - несмотря на то, что реализован метод hashCode и equals - PullRequest
3 голосов
/ 15 февраля 2012

Есть два набора, которые имеют один и тот же элемент.

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, поскольку я явно сделал их неизменными.Так что я совершенно растерялся из-за того, почему это происходит.

Заранее благодарен за любую помощь.

...