時(shí)間戳:自1970年1月1日0時(shí)0分0秒與著之后指定時(shí)間的時(shí)間差扰肌,單位毫秒厉斟。
1. new Date().getTime()和System.currentTimeMillis()對(duì)比
我在工作中屎篱,看項(xiàng)目組的代碼時(shí)敌买,在代碼中會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象棒坏,有使用new Date().getTime()來(lái)獲取時(shí)間戳的八匠, 也有使用System.currentTimeMillis()來(lái)獲取時(shí)間戳的,回想一下咬腕,好像我平日寫(xiě)代碼也是想起哪種方式就用什么方式寫(xiě)欢峰。仔細(xì)思考一下,兩者有什么區(qū)別嗎?有沒(méi)有哪個(gè)是最優(yōu)的方式纽帖?
解決疑惑最優(yōu)方式就是看源碼宠漩,打開(kāi)java.util.Date的源碼可以發(fā)現(xiàn),無(wú)參構(gòu)造函數(shù)如下:
public Date() {
this(System.currentTimeMillis());
}
從源碼可以看出懊直,new Date()其實(shí)就是調(diào)用了System.currentTimeMillis()扒吁,再傳入自己的有參構(gòu)造函數(shù)。不難看出室囊,如果只是僅僅獲取時(shí)間戳雕崩,即使是匿名的new Date()對(duì)象也會(huì)有些許的性能消耗, 從提升性能的角度來(lái)看波俄,只是僅僅獲取時(shí)間戳晨逝,不考慮時(shí)區(qū)的影響(時(shí)區(qū)為什么會(huì)有影響看下一段),直接調(diào)用System.currentTimeMillis()會(huì)更好一些懦铺。
new Date()來(lái)獲取當(dāng)前時(shí)間更多的是因?yàn)槲覀兪褂昧?xí)慣導(dǎo)致經(jīng)常第一時(shí)間想到用它來(lái)獲取當(dāng)前時(shí)間;
java.util.Date其實(shí)是設(shè)計(jì)來(lái)作為格式化時(shí)間捉貌,以面向?qū)ο蟮姆绞将@取與時(shí)間有關(guān)的各方面信息,例如:獲取年月份冬念、小時(shí)趁窃、分鐘等等比較豐富的信息
獲取時(shí)間戳的擴(kuò)展
在Java中,還可能見(jiàn)到另外一種獲取時(shí)間的方式:
Calendar.getInstance().getTimeInMillis()
這種方式其實(shí)是速度最慢,看其源碼就會(huì)發(fā)現(xiàn)急前,Canlendar是區(qū)分時(shí)區(qū)的醒陆,因?yàn)橐幚頃r(shí)區(qū)問(wèn)題會(huì)耗費(fèi)很多的時(shí)間,而System.currentTimeMillis()裆针,看其源碼:
public static native long currentTimeMillis()
這是一個(gè)本地方法刨摩,其時(shí)間來(lái)源依賴(lài)由操作系統(tǒng)為其做了時(shí)區(qū)的處理,因此獲取時(shí)間戳世吨,不需要考慮時(shí)區(qū)的前提下澡刹,它是最優(yōu)選擇。
這里多說(shuō)一句耘婚,System類(lèi)是一些與系統(tǒng)相關(guān)的屬性和方法的集合, 而且在System類(lèi)中所有的屬性和方法都是靜態(tài)的罢浇,直接使用System調(diào)用即可, 調(diào)用System類(lèi)性能相對(duì)更優(yōu)越沐祷,很多方法也都是非常有用的嚷闭,例如:
* src 是要復(fù)制的數(shù)組,
* srcPos 是從要復(fù)制的數(shù)組的第幾個(gè)開(kāi)始,
* dest 是復(fù)制到那赖临,
* destPos 是復(fù)制到的數(shù)組第幾個(gè)開(kāi)始胞锰,
* length 是需要復(fù)制的長(zhǎng)度
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length);