Создан статический вложенный класс, который реализует Comparable
и переопределяет Object.equals таким образом, что e1.compareTo(e2)==0
и e1.equals(e2)==true
не являются синонимами.
Затем я добавляю объекты в TreeSet
и HashSet
соответственно, используя его метод добавления.
Я ожидал, что вставка нескольких таких объектов либо в TreeSet, либо в HashSet будет успешной, поскольку оба утверждают, что они полагаются на равенство для определения уникальности, но я обнаружил, что вставка нескольких таких объектов в TreeSet
завершится ошибкой, а вставка их в HashSet
будет успешной.
public class Test {
/*
* This inner class deliberately has a compareTo method that is not
* consistent with equals
*/
static class TestObject implements Comparable<TestObject> {
@Override
public int compareTo(TestObject arg0) {
// No two of these objects can be ordered
return 0;
}
@Override
public boolean equals(Object arg0) {
// No two of these objects are ever equal to each other
return false;
}
}
public static void printSuccess(boolean success) {
if (success)
System.out.println(" Success");
else
System.out.println(" Failure");
}
public static void main(String[] args) {
TreeSet<TestObject> testTreeSet = new TreeSet<TestObject>();
HashSet<TestObject> testHashSet = new HashSet<TestObject>();
System.out.println("Adding to the HashSet:");
printSuccess(testHashSet.add(new TestObject()));
printSuccess(testHashSet.add(new TestObject()));
printSuccess(testHashSet.add(new TestObject()));
System.out.println("Copying to the TreeSet:");
for (TestObject to : testHashSet) {
printSuccess(testTreeSet.add(to));
}
}
}
Вывод вышеуказанной программы
Adding to the HashSet:
Success
Success
Success
Copying to the TreeSet:
Success
Failure
Failure
Может ли кто-нибудь сказать мне, почему Tree set ведет себя так?
hashCode
такой же? - person Shark   schedule 08.05.2017hashCode()
никогда не переопределялся. Возможно, для всех экземпляров используется один и тот же хеш-код. - person Tim Biegeleisen   schedule 08.05.2017hashcode
/equals
нарушен. любые два объекта, для которыхo1.equals(o2)
истинно, должны иметь один и тот же хэш-код. Это также означает, что в коллекции на основе хэша нет двух объектов, для которыхo1.equals(o2)
является истинным. - person Timothy Truckle   schedule 08.05.2017