创建一个实现Comparable
的静态嵌套类,并覆盖Object.equals,使e1.compareTo(e2)==0
和e1.equals(e2)==true
不是同义词。
然后我使用add方法将对象分别添加到TreeSet
和HashSet
。
我期望将多个这样的对象插入到TreeSet或HashSet中会成功,因为两者都声称依赖于equals来确定唯一性,但是我发现将多个这样的对象插入到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表现得像这样吗?
答案 0 :(得分:5)
compareTo
的返回值0表示对象相等,因此e1.compareTo(e2) == 0
当且仅当e1.equals(e2) == true
。
TreeSet保证使用compare方法,因此它使用compare方法,而HashSet则不使用equals方法。请尝试将compareTo方法更改为正/负数。
您可以阅读有关Compareable界面here的更多信息。
答案 1 :(得分:0)
此外,javadoc of java.util.Comparator
明确说明了此案例,并告知Comparator
的{{1}}必须与SortedSet
保持一致:
例如,假设一个人添加了两个元素a和b (a.equals(b)&amp;&amp; c.compare(a,b)!= 0)到一个空的TreeSet 比较器c。第二个添加操作将返回true(和大小 由于a和b不相等,因此树集会增加) 树集的视角,即使这是相反的 Set.add方法的规范。