Почему мой Java LinkedHashSet не удаляет содержащийся в нем объект? - PullRequest
1 голос
/ 26 октября 2011

У меня есть объект в LinkedHashSet, который реализует equals, hashCode и compareTo (в суперклассе), но когда я пытаюсь удалить этот точный объект из набора set.remove(obj), метод удаления возвращает false и объект остается в наборе.Должна ли реализация LinkedHashSet вызывать метод equals() своих объектов?Потому что это не так.Может ли это быть ошибка Java?Я бегу 1.6.0_25.

Ответы [ 3 ]

4 голосов
/ 26 октября 2011

Я полагаю, что реализация hashCode() вашего объекта возвращает значение, отличное от того, когда вы добавили объект в набор.

0 голосов
/ 26 октября 2011

Вероятность ошибки в LinkedHashSet бесконечно мала . Вы должны отклонить это как правдоподобное объяснение вашей проблемы.

Если предположить, что это ошибка в вашем коде, то это может быть связано с несколькими причинами. Например:

  • Ваши методы equals и hashCode возвращают противоречивые ответы для объекта.
  • Ваши методы equals или hashCode зависят от изменяемых полей, и эти поля изменяются, пока объект находится в наборе. (Например, если значение хеш-кода изменяется, объект, вероятно, находится в неправильной цепочке хеширования, в результате чего метод remove не может его найти.)
  • Вы объявили метод equals как перегрузку, а не переопределение equals(Object). (Это может объяснить, почему ваш equals не вызывается ... при условии, что ваше утверждение действительно верно.)
  • Объект, который вы пытаетесь удалить, (на самом деле) не тот, который вы вставили.
  • Что-то еще уже удалило объект.
  • Вы используете другую версию некоторого класса, которая не соответствует исходному коду, который вы изучали.

Теперь я знаю, что вы отклонили некоторые из этих объяснений. Но это, возможно, было преждевременным. Просмотрите доказательства , на которых вы основали это увольнение.

Другой подход, который вы можете использовать, - это использовать отладчик Java для криминалистической проверки структур данных (например, внутренностей LinkedHashSet) и пошагового кода, в котором предполагается удаление.

0 голосов
/ 26 октября 2011

LinkedHashSet отлично работает у меня:

import java.util.*;

public class Test {
    public static void main( String[] args ) {
        LinkedHashSet<String> lhs = new LinkedHashSet<String>();
        String s = "hi";
        lhs.add( s );
        System.out.println( lhs );
        lhs.remove( s );
        System.out.println( lhs );
    }
}

Возможно, вы передаете ссылку на другой объект для метода удаления? Вы уверены, что не изменили ссылку каким-либо образом?

Также убедитесь, что hashCode() возвращает то же значение, когда вы вставляете его, как и при попытке удалить его.

...