Какова возможная причина для удаления элемента из HashSet непосредственно перед его повторным добавлением?

Я наткнулся на какой-то код, который в целом соответствует следующим строкам, но не может для меня в жизни понять, почему автор пытается удалить bar из bars прежде чем добавлять ее:

import java.util.Set;
import java.util.HashSet;

class Foo {

  private final Set<Object> bars = new HashSet<>();

  public void addBar(final Object bar) {
    bars.remove(bar);  // WHY ????
    bars.add(bar);
  }

  public Object[] getBars() {
    return bars.toArray(new Object[0]);
  }
}

Все, что я могу придумать, состоит в том, что в ожидании (или наследства) другой реализации Set , чувствительной к порядку вставки, такой как java.util.LinkedHashSet (хотя в коде или случае использования нет ничего, что предполагает, что порядок вставки будет быть интересным), - но, возможно, есть что-то еще, что мне не хватает?

Всего 1 ответ


Если у вас есть панель классов, в которой есть поля, которые не включены в проверку equals этот код заставляет новый экземпляр (с потенциально различным содержимым) находиться в наборе по сравнению с старым экземпляром, оставшимся в Set:

public static void main(String[] args) {
    Set<Object> bars = new HashSet<Object>();
    Bar bar1 = new Bar(1, 2);
    Bar bar2 = new Bar(1, 3);

    bars.add(bar1);
    bars.add(bar2); // no effect since bar1.equals(bar2)
    // only bar1 in the set

    bars.remove(bar2); // removes bar1 since bar1.equals(bar2)
    bars.add(bar2);
    // only bar2 in the set
}

static class Bar {
    int field1;
    int field2;

    public Bar(int field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Bar)) return false;
        Bar bar = (Bar) o;
        return field1 == bar.field1;
    }

    @Override
    public int hashCode() {
        return Objects.hash(field1);
    }
}

Есть идеи?

10000