java.util.Date equals() 似乎没有按预期工作
问题
我有一个,以及数据库中带有属性的对象列表,我想检查我的映射中的键是否等于数据库中的任何s - 如果是这样,请使用.Map<Date, Foo>
effectiveDate
Date
effectiveDate
Foo
代码如下所示:
for (Bar bar : databaseBars) {
Foo foo = new Foo();
if (dateMap.containsKey(bar.getEffectiveDate()) {
foo = dateMap.get(bar.getEffectiveDate());
}
// do stuff with foo and bar
}
但是,该调用始终返回 false,即使我确信它有时存在。dateMap.containsKey
调查
作为健全性检查,我打印出了日期的长值,以及呼叫和调用的结果:equals()
compareTo()
for (Date keyDate : dateMap.keySet()) {
if (keyDate == null) {
continue; // make things simpler for now
}
Date effDate = bar.getEffectiveDate();
String template = "keyDate: %d; effDate: %d; equals: %b; compareTo: %d\n";
System.out.printf(template, keyDate.getTime(), effDate.getTime(), effDate.equals(keyDate), effDate.compareTo(keyDate));
}
结果:
keyDate: 1388534400000; effDate: 1388534400000; equals: false; compareTo: 0
keyDate: 1420070400000; effDate: 1388534400000; equals: false; compareTo: -1
keyDate: 1388534400000; effDate: 1420070400000; equals: false; compareTo: 1
keyDate: 1420070400000; effDate: 1420070400000; equals: false; compareTo: 0
keyDate: 1388534400000; effDate: 1388534400000; equals: false; compareTo: 0
keyDate: 1420070400000; effDate: 1388534400000; equals: false; compareTo: -1
keyDate: 1388534400000; effDate: 1420070400000; equals: false; compareTo: 1
keyDate: 1420070400000; effDate: 1420070400000; equals: false; compareTo: 0
keyDate: 1388534400000; effDate: 1388534400000; equals: false; compareTo: 0
keyDate: 1420070400000; effDate: 1388534400000; equals: false; compareTo: -1
keyDate: 1388534400000; effDate: 1420070400000; equals: false; compareTo: 1
keyDate: 1420070400000; effDate: 1420070400000; equals: false; compareTo: 0
问题
1)不应该同意吗?(我假设的实现至少应该尽量遵循的建议)。equals
compareTo
java.util.Date
java.lang.Comparable
因此,当且仅当 getTime 方法为两个对象返回相同的长整型值时,两个 Date 对象是相等的。
...看起来该方法为这两个日期返回相同的长整型值,但返回 false。任何想法为什么会发生这种情况?我搜索了高和低,但我没有找到任何人描述同样的问题。getTime
equal
附言:我被困在使用.请不要只是推荐JodaTime。java.util.Date
附言我意识到我可以改变这段代码的结构,并可能让它工作。但这应该有效,我不想只是解决它,除非它是一个已知的问题或其他东西。这似乎是错误的。