比较器始终需要返回一致的结果,并且在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保持一致的其他条件,因为即使不等于
otherMap.get(s1).compareTo(otherMap.get(s2))也可能返回。
0``s1``s2
从评论:
即使比较器的结果不一致,Java语言是否也不应该允许重复的键?
不,当您插入密钥时,TreeMap将使用比较器搜索数据结构以查看密钥是否已存在。如果比较器给出的结果不一致,则TreeMap可能 会在错误的位置查找
并得出该键不存在的结论,从而导致不确定的行为。



