为什么Java中TimeStamp不能用来替换Date

在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的类型匹配:

Paste_Image.png

所以尽管Date和Timestamp包含date和time的值,它们各自的getMonth(), getHours()方法不会抛出IllegalArgumentException异常,由于以上提到的问题你不应该使用Timestamp来替代java.util.Date.Timestamp和java.util.Date的继承关系实际上表示实现继承,不是类型继承,这不是一个很好的设计,但是有时可以找到这种现象甚至在设计很好的api像JDK或者Jdbc。

翻译自:why-timestamp-cannot-be-used-in-place-of-date-in-java

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容