java.util.Date equals()似乎未按预期工作

java.util.Date equals()似乎未按预期工作,第1张

java.util.Date equals()似乎未按预期工作

正如Mureinik所暗示和SotiriosDelimanolis更加具体指出的那样,这里的问题在于实现

java.util.Date

java.util.Date
java.sql
包中被3个类扩展,所有这些类似乎都做类似的事情,并且它们在java中的区别根本不清楚(似乎它们存在的原因仅仅是使Java类更准确地与SQL数据类型对齐)-有关它们之间差异的更多信息,请查看此非常详细的答案。

现在,在看似严重的设计缺陷中,有人决定对它进行

equals()
不对称处理
java.sql.Timestamp

-也就是说,
timestamp.equals(date)
即使
date.equals(timestamp)
返回true ,也可能返回false
。好想法。

我写了几行代码,看看哪些

java.sql
类展示了这个荒谬的特性-显然只是
Timestamp
。这段代码:

java.util.Date utilDate = new java.util.Date();java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());System.out.println("sqlDate equals utilDate:t" + sqlDate.equals(utilDate));System.out.println("utilDate equals sqlDate:t" + utilDate.equals(sqlDate));java.sql.Time time = new java.sql.Time(utilDate.getTime());System.out.println("time equals utilDate:tt" + time.equals(utilDate));System.out.println("utilDate equals time:tt" + utilDate.equals(time));java.sql.Timestamp timestamp = new java.sql.Timestamp(utilDate.getTime());System.out.println("timestamp equals utilDate:t" + timestamp.equals(utilDate));System.out.println("utilDate equals timestamp:t" + utilDate.equals(timestamp));

产生此:

sqlDate equals utilDate:    trueutilDate equals sqlDate:    truetime equals utilDate:       trueutilDate equals time:       truetimestamp equals utilDate:  falseutilDate equals timestamp:  true

由于在(而不是)的实现中

java.util.HashMap
使用
parameter.equals(key)
了该
containsKey()
key.equals(parameter)
结果,因此在给定的情况下会显示出一个奇怪的结果。

那么,如何解决这个问题?

1)使用

Long
的地图键,而不是一个
Date
(如Mureinik说明)
-自从
java.util.Date
java.util.Timestamp
来自返回相同的值
getTime()
,它不应该不管你使用的实施,关键将是相同的。这种方法看起来确实是最简单的。

2)在地图中使用日期对象之前,先对其进行标准化。这种方法需要一点点工作,但对我来说似乎更可取,因为它更清楚地图是什么-
一堆

Foo
存储在一个时刻。这是我最终通过以下方法使用的方法:

public Date getStandardizedDate(Date date) {  return new Date(date.getTime());}

这需要一个额外的方法调用(这在当时是一种荒谬的调用),但是对我而言,涉及的代码的更高可读性

Map<Date,Foo>
是值得的。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5586973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存