比较器始终需要返回一致的结果,并且在TreeMap中使用时,应与equals保持一致.
在这种情况下,您的比较器违反了第一个约束,因为它不一定给出一致的结果.
示例:如果例如otherMap地图
"a" -> "someString"
"b" -> "someString"
然后compare(“ a”,“ b”)和compare(“ b”,“ a”)都将返回-1.
请注意,如果您将实现更改为
if (s1.equals(s2)) {
return 0;
}
return otherMap.get(s1).compareTo(otherMap.get(s2));
您违反了其他与equals一致的条件,因为即使s1不等于s2,otherMap.get(s1).compareTo(otherMap.get(s2))可能返回0.
我在一个自我解答的后续问题here中对此进行了详细说明.
从评论:
Even if a comparator gives inconsistent results, shouldn’t the Java language still not allow duplicate keys?
不,当您插入密钥时,TreeMap将使用比较器搜索数据结构以查看密钥是否已存在.如果比较器给出的结果不一致,则TreeMap可能会在错误的位置查找并得出该键不存在的结论,从而导致不确定的行为.