我正在寻找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
答案 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通过添加额外的方法isAfter
,isBefore
和isEqual
来避免不一致,以便进行时间线比较/等式检查。
答案 1 :(得分:10)
寻找"与equals"不一致在JDK课程中,我还找到了java.time.zone.ZoneOffsetTransition