new Date().getTime()和System.currentTimeMillis()对比

我在工作中,看项目组的代码时,在代码中会发现一个有趣的现象,有使用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

原文地址:https://www.cnblogs.com/cxiang/p/10536712.html

时间: 2024-11-07 08:19:44

new Date().getTime()和System.currentTimeMillis()对比的相关文章

new Date().getTime()和System.currentTimeMillis()效率对

public static void main(String[] args) {     ArrayList<Long> l = new ArrayList<>(7500001);     long start= System.currentTimeMillis();     for(int i =0 ; i < 5000000; i ++){         long now = new Date().getTime();         l.add(now);     }

Java 中时间处理 System.currentTimeMillis()

import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date; public class TestDate { @Test public void test01() throws ParseException { Date dt= new Date(); long s=System.currentTimeMilli

System.currentTimeMillis()和new Date().getTime()比较

获取时间毫秒数时System.currentTimeMillis()方法比new Date().getTime()效率高, 因为new Date().getTime()方法调用的System.currentTimeMillis() Date类的构造函数直接调用的System.currentTimeMillis()获取fastTime毫秒值: getTime()方法在cdate为空(Date对象在进行无参构造创建对象时cdate默认为null)的情况下直接返回fastTime.

java使用new Date()和System.currentTimeMillis()获取当前时间戳(转载)

转自:http://www.cnblogs.com/wuchen/archive/2012/06/30/2570746.html 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信 息是比较丰富的.但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如getTime().为了获取这个时间戳,很多人也喜欢使用new Date().getT

Java中使用new Date()和System.currentTimeMillis()获取当前时间戳的区别(转)(Java进阶-性能提升)

在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的.但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如getTime().为了获取这个时间戳,很多人也喜欢使用new Date().getTime()去获取,咋一看没什么问题,但其实没这个必要.其实看一下Java的源码就知道了: public Date() { this(

java使用new Date()和System.currentTimeMillis()获取当前时间戳

在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的.但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如getTime().为了获取这个时间戳,很多人也喜欢使用new Date().getTime()去获取,咋一看没什么问题,但其实没这个必要.其实看一下java的源码就知道了: public Date() { this(

java.util.Date和java.sql.Date以及System.currentTimeMillis()涉及到时间的问题

java.util.Date与java.sql.Date的区别 util.Date 1 java.util.Date nowUtil =new java.util.Date();//new了一个util.Date 2 SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMMdd HH:mm:ss");//设置格式 3 String time = sdf.format(nowUtil); 5 System.out.println(nowUtil

Java进阶 十六 使用new Date 和System currentTimeMillis 获取当前时间戳

java使用new Date()和System.currentTimeMillis()获取当前时间戳 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的.但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如getTime().为了获取这个时间戳,很多人也喜欢使用new Date().getTime()去获取,咋一看没什么

获取方法执行时间 -System.currentTimeMillis();

1.代码 public class TimeTest { /**     * 计算两个时间点直接逝去的毫秒数     *     */    public void computeAndDisplayElapsedTime() {        //定义开始时间        long startTime = System.currentTimeMillis();//获取当前时间 for (int i = 0; i < 10; i++) {            try {