在Java的面试中有一个微妙的问题是,“我们能否给一个需要java.util.Date方法传递一个Timestamp实例”,这是一个微妙的问题因为答案就是Yes或者No,当然,你可以传递一个Timestamp实例给一个Date作为参数的方法。首先,Timestamp是java.util.Date的子类。第二,它包含了java.sql.Date和java.sql.Time各自缺少的日期和时间的值。可能还有其它的原因使你传递一个Timestamp的值给Date,但是你不应该这样做。为什么?因为Timestamp并不完全是Date。它是java.util.Date的组合类型,一个额外的纳秒的值来巩固数据库的DataTime数据类型,支持纳秒的精度。如果你看了java.sql.Timestamp的实现,你会发现Date提供的Long类型值是被分开存的,这个纳秒值。
你不能比较Data和TimeStamp类。当你传递一个java.util.Date实例时Timestamp.equals(Object)方法会返回false,因为date的纳秒信息是未知的。结果是,Timestamp.equals(Object)方法和对应的java.util.Date.equals(Object)不是对称的。另外,hashCode方法基于java.util.Date的实现,所以不会在计算中包含纳秒的值。See Core Java Volume 2 - Advanced Features by Cay S.
为了更好的学习TimeStamp和Date,我们来看Java中比较Date和Timestamp的例子:
package com.tiny.work.test.test;
import java.sql.Timestamp;
import java.util.Date;
/* * Java Program to compare Date and Timestamp in JDBC */
public class TimeStampVsDate {
public static void main(String[] args) {
Date date = new Date();
Timestamp timestamp = new Timestamp(date.getTime());
if (date.equals(timestamp)) {
System.out .println("Both Date and Timestamp are equal, when you compare using Date.equals() method");
}
if (!timestamp.equals(date)) {
System.out .println("But, they are not equal when you compare them using Timestamp.equals() method");
}
}
}
Output
Both Date and Timestamp are equal, when you compare using Date.equals() method
But, they are not equal when you compare them using Timestamp.equals() method
所以,你可以看到equals方法没有对称的性质,如果a.equals(b)是true,那么b.equals(a)是false
为了需要一点复习关于Java类型匹配数据库的Sql类型,这里有一个很好的图片关于Java到Sql的类型匹配:
所以尽管Date和Timestamp包含date和time的值,它们各自的getMonth(), getHours()方法不会抛出IllegalArgumentException异常,由于以上提到的问题你不应该使用Timestamp来替代java.util.Date.Timestamp和java.util.Date的继承关系实际上表示实现继承,不是类型继承,这不是一个很好的设计,但是有时可以找到这种现象甚至在设计很好的api像JDK或者Jdbc。