Java 的比较器契约

标签 java collections comparator

Comparator接口(interface)的契约中规定,它必须与equals一致。

这是否意味着如果 equalsTo = true 则 Comparator = 0,或者是否意味着当且仅当 equalsTo = true 时 Comparator = 0?

我似乎记得它是第二个,但我遇到过很多按非唯一子属性排序的比较器。

例如,我可能有一些具有子属性日期的对象,并且我想按提交日期对对象列表进行排序。但是,您可以拥有多个具有相同日期的对象吗?这会带来什么后果?这个问题肯定已经有最佳实践解决方案了吗?如何在不违反比较器契约的情况下按不能保证唯一的属性对集合进行排序?此类违规行为会产生什么后果?它们可以管理吗?

最佳答案

Comparator 必须与 equals 一致的说法根本不正确。

文档仅警告这种情况:

Caution should be exercised when using a comparator capable of imposing an ordering inconsistent with equals to order a sorted set (or sorted map) (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)

如果您有一个基于日期的排序,另一个基于日期+时间的排序,您应该简单地实现多个比较器。

也许您混淆了 Comparator 和 Comparable?对于可比性,文档强烈建议不要出现这种情况:

It is strongly recommended (though not required) that natural orderings be consistent with equals. (http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html)

如果您意识到一个对象只能有 1 个 Comparable 实现,但有多个 Comparator 实现,那么这种差异是有意义的。 Comparator 的整体思想是有多种方法来比较同一类。

关于Java 的比较器契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22909768/

相关文章:

java - 为什么 JIT 也编译字节码而 Java 既是编译型又是解释型语言?

java - 如何让 Spring Data Couchbase 保留 id 字段?

collections - 如何在我的 YAML Swagger 定义中将属性类型定义为字符串列表(列表、集合、数组、集合)

java - 正确排序集合中的相等项目

java - 什么 Java 数据结构/解决方案最适合这些要求?

java - 比较器不会删除 TreeSet 中的数字重复项

java - 跨两个应用服务器管理 session

java - Comparator<String> 必须覆盖父类(super class)方法

c++ - C++ 如何隐式地将参数转换为比较器,例如 <?

java - 使用 Selenium 从 XML 文件填写表单