HashSet с двумя равными объектами? - PullRequest
4 голосов
/ 30 октября 2010

Я создал объект HashSet, а значением является объект (Triple), который является моим собственным классом.Но я получаю странную вещь, когда в моем HashSet есть два одинаковых объекта, возможно ли это?Вот мой основной метод для равных в классе Triple

 @Override
 public boolean equals(Object other){
 if (other == null) return false;
 if (other == this) return true;
 if (this.getClass() != other.getClass()) return false;
 Triple otherTriple = (Triple)other;

 if(otherTriple.getSubject().equals(getSubject()) &&
   otherTriple.getPredicate().equals(getPredicate()) &&
   otherTriple.getObject().equals(getObject()))
  return true;
 return false;

}

Ответы [ 4 ]

5 голосов
/ 30 октября 2010

Вы должны быть уверены, что также реализовали hashCode (), и когда два Тройки равны, их хэш-коды также должны быть равны.Если вы этого не сделаете, вы получите странное поведение.

4 голосов
/ 30 октября 2010

Вы не переопределили equals и hashCode в вашем классе должным образом. Вот как это написать и протестировать:

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

2 голосов
/ 23 января 2012

Похоже, он возвращает true только для строк ... я пытаюсь запустить приведенный ниже код

            final HashSet<Car> carHashSet = new HashSet<Car>();
    final Car c1 = new  Car("black","ZX","deisel");
    final Car c2 = new  Car("black","ZX","deisel");
    carHashSet.add(c1);

    if (carHashSet.contains(c2))
        System.out.println("has c2 obj");
    else
        System.out.println("dont have C2 obj");

    final HashSet<String> stringHashSet = new HashSet<String>();

    final String k1 = "test";
    final String k2 = "test";//final String k2 = "Test";

    stringHashSet.add(k1);

    if (stringHashSet.contains(k2))
        System.out.println("has k2 obj");
    else
        System.out.println("dont have k2 obj");

вывод такой, как показано ниже:

нет C2 obj имеет k2 obj

когда я изменяю k2 на окончательный String k2 = "Test"; вывод:

не имеет C2 obj не имеет k2 obj

1 голос
/ 30 октября 2010

У меня проблемы с пониманием вашего вопроса, но семантика hashCode () и equals () важна только тогда, когда вы планируете использовать объект в качестве ключа. И у вас не может быть двух объектов, оценивающих один и тот же хеш на карте ... один переопределит другой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...