是否有任何标准的Java类具有不一致的compareTo()和equals()?

时间:2015-05-10 13:50:23

标签: java

我正在寻找compareTo()可以返回0的所有标准Java类,而equals()返回false

Comparable comparable1 = ???;
Comparable comparable2 = ???;

assert comparable1.compareTo(comparable2) == 0;
assert !comparable1.equals(comparable2);

我只知道一个:new BigDecimal("1.0")使用new BigDecimal("1")等于compareTo()但使用equals()等于Calendar calendar1 = new GregorianCalendar(0, 0, 0); Calendar calendar2 = new GregorianCalendar(0, 0, 0); calendar2.setLenient(false); Comparable comparable1 = calendar1; Comparable comparable2 = calendar2; assert comparable1.compareTo(comparable2) == 0; // compareTo compares along the timeline assert !comparable1.equals(comparable2); // equals compares state, leniency is different 。还有其他人吗?

我对所有这些类感兴趣,但只对公共Java API感兴趣。我需要它为AssertJ的UnevenComparableAssert界面提供全面的文档。

修改

感谢@ErikVesteraas,我设法重现了另一个例子:

innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 256M
innodb-flush-log-at-trx-commit = 0
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 6G

2 个答案:

答案 0 :(得分:27)

实际上似乎有一些例子,但有些在代码或JavaDoc中没有很好地记录。 Stephen Colebourne的This blog post给出了详细信息,但总的来说,以下类与equals不一致:

例如:

ObjectStreamField a = new ObjectStreamField("foo", String.class);
ObjectStreamField b = new ObjectStreamField("foo", String.class);
a.equals(b); // false, checks object equality
a.compareTo(b); // 0

正如Olivier所指出的,Java 8还增加了java.time.zone.ZoneOffsetTransition

值得注意的是,java.time.OffsetTime通过添加额外的方法isAfterisBeforeisEqual来避免不一致,以便进行时间线比较/等式检查。

答案 1 :(得分:10)

寻找"与equals"不一致在JDK课程中,我还找到了java.time.zone.ZoneOffsetTransition