正如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>是值得的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)