在Java的面試中有一個微妙的問題是耙厚,“我們能否給一個需要java.util.Date方法傳遞一個Timestamp實例”,這是一個微妙的問題因為答案就是Yes或者No襟铭,當(dāng)然犀盟,你可以傳遞一個Timestamp實例給一個Date作為參數(shù)的方法。首先搪桂,Timestamp是java.util.Date的子類。第二盯滚,它包含了java.sql.Date和java.sql.Time各自缺少的日期和時間的值踢械。可能還有其它的原因使你傳遞一個Timestamp的值給Date魄藕,但是你不應(yīng)該這樣做内列。為什么?因為Timestamp并不完全是Date泼疑。它是java.util.Date的組合類型德绿,一個額外的納秒的值來鞏固數(shù)據(jù)庫的DataTime數(shù)據(jù)類型,支持納秒的精度退渗。如果你看了java.sql.Timestamp的實現(xiàn)移稳,你會發(fā)現(xiàn)Date提供的Long類型值是被分開存的,這個納秒值会油。
你不能比較Data和TimeStamp類个粱。當(dāng)你傳遞一個java.util.Date實例時Timestamp.equals(Object)方法會返回false,因為date的納秒信息是未知的翻翩。結(jié)果是都许,Timestamp.equals(Object)方法和對應(yīng)的java.util.Date.equals(Object)不是對稱的。另外嫂冻,hashCode方法基于java.util.Date的實現(xiàn)胶征,所以不會在計算中包含納秒的值。See Core Java Volume 2 - Advanced Features by Cay S.
為了更好的學(xué)習(xí)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方法沒有對稱的性質(zhì),如果a.equals(b)是true服傍,那么b.equals(a)是false
為了需要一點復(fù)習(xí)關(guān)于Java類型匹配數(shù)據(jù)庫的Sql類型钱雷,這里有一個很好的圖片關(guān)于Java到Sql的類型匹配:
所以盡管Date和Timestamp包含date和time的值,它們各自的getMonth(), getHours()方法不會拋出IllegalArgumentException異常吹零,由于以上提到的問題你不應(yīng)該使用Timestamp來替代java.util.Date.Timestamp和java.util.Date的繼承關(guān)系實際上表示實現(xiàn)繼承罩抗,不是類型繼承,這不是一個很好的設(shè)計灿椅,但是有時可以找到這種現(xiàn)象甚至在設(shè)計很好的api像JDK或者Jdbc套蒂。