java equals utils_java.util.Date equals()似乎没有按预期工作

问题

我有一个Map< Date,Foo>和一个来自数据库的对象列表,其中包含一个有效的属性,我想查看我的地图中的Date键是否等于数据库中的任何有效日期 – 如果是用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

}

但是,dateMap.containsKey调用总是返回false,即使我确定它有时在那里.

调查

作为一个理智检查,我打印出了很长的日期值,以及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)不应该等于和比较同意? (我假设java.util.Date的实现至少应该尝试遵循java.lang.Comparable的建议).

Thus,two Date objects are equal if and only if the getTime method returns the same long value for both.

…看起来getTime方法为这两个日期返回相同的long值,但相等则返回false.有什么想法可能会发生吗?我搜索过高低,但我还没有发现任何人描述同样的问题.

附:我被卡住了使用java.util.Date.请不要只推荐JodaTime.

P.P.S.我意识到我可以改变这个代码的结构,并且可能会使它工作.但这应该是有效的,我不想只是解决它,除非是一个已知的问题或事情.这似乎是错误的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值