我在工作中,看項目組的代碼時,在代碼中會發現一個有趣的現象,有使用new Date().getTime()來獲取時間戳的, 也有使用System.currentTimeMillis()來獲取時間戳的,回想一下,好像我平日寫代碼也是想起哪種方式就用什么方式寫。仔細思考一下,兩者有什么區別嗎?有沒有哪個是最優的方式?
解決疑惑最優方式就是看源碼,打開java.util.Date的源碼可以發現,無參構造函數如下:
public Date() { this(System.currentTimeMillis()); }
從源碼可以看出,new Date()其實就是調用了System.currentTimeMillis(),再傳入自己的有參構造函數。不難看出,如果只是僅僅獲取時間戳,即使是匿名的new Date()對象也會有些許的性能消耗, 從提升性能的角度來看,只是僅僅獲取時間戳,不考慮時區的影響(時區為什么會有影響看下一段),直接調用System.currentTimeMillis()會更好一些。
new Date()來獲取當前時間更多的是因為我們使用習慣導致經常第一時間想到用它來獲取當前時間;
java.util.Date其實是設計來作為格式化時間,以面向對象的方式獲取與時間有關的各方面信息,例如:獲取年月份、小時、分鍾等等比較豐富的信息
獲取時間戳的擴展
在Java中,還可能見到另外一種獲取時間的方式:
Calendar.getInstance().getTimeInMillis()
這種方式其實是速度最慢,看其源碼就會發現,Canlendar是區分時區的,因為要處理時區問題會耗費很多的時間,而System.currentTimeMillis(),看其源碼:
public static native long currentTimeMillis()
這是一個本地方法,其時間來源依賴由操作系統為其做了時區的處理,因此獲取時間戳,不需要考慮時區的前提下,它是最優選擇。
這里多說一句,System類是一些與系統相關的屬性和方法的集合, 而且在System類中所有的屬性和方法都是靜態的,直接使用System調用即可, 調用System類性能相對更優越,很多方法也都是非常有用的,例如:
* src 是要復制的數組,
* srcPos 是從要復制的數組的第幾個開始,
* dest 是復制到那,
* destPos 是復制到的數組第幾個開始,
* length 是需要復制的長度
*/
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
鏈接:https://www.jianshu.com/p/5efbdc579f3d
