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

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

  1. new Date().getTime()和System.currentTimeMillis()的区别

    在Java中,new Date().getTime()和System.currentTimeMillis()都是用来获取当前时间的,并可以用DateFormat转成对应的时间格式,代码如下. impo ...

  2. java: new Date().getTime() 与 System.currentTimeMillis() 与 System.nanoTime()

    java使用new Date()和System.currentTimeMillis()获取当前时间戳   在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时 ...

  3. Java 中时间处理 System.currentTimeMillis()

    import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat ...

  4. 系统当前时间system.currenttimemillis与new Date().getTime() 区别

    system.currenttimemillis //取到毫秒数,并且执行效率高 new Date().getTime()没他精确

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

    java使用new Date()和System.currentTimeMillis()获取当前时间戳 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可 ...

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

    在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的 ...

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

    转自:http://www.cnblogs.com/wuchen/archive/2012/06/30/2570746.html 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间, ...

  8. 关于System.currentTimeMillis()

    一.时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)1秒=1,000,000,000 纳秒(ns ...

  9. date.getTime()

    Date date = new Date(); System.out.println(date.getTime()); 输出结果是1210745780625 编译时间当时时间大概是2008年5.14好 ...

随机推荐

  1. javaScript之数组操作方法(一)

    本篇文章主要总结了几个简单的数组操作方法.数组就是一组数据的集合,接下来我们就了解一下几种数组的操作方法. 1. join方法:把数组的所有元素放入一个字符串.举例如下: var arrJoin=[& ...

  2. MapReduce(二) MR的高级特性-序列化、排序、分区、合并

    一.序列化   (*) 核心接口:Writable接口.如果有一个类实现了Writable接口,就可以作为Map/Reduce的key和value.    举例: 读取员工数据,生成员工对象,直接存储 ...

  3. Java Spring 在线程中或其他位置获取 ApplicationContext 或 ServiceBean

    部分一转载自:http://blog.csdn.net/yang123111/article/details/32099329 via @yang123111 部分二转载自:http://www.cn ...

  4. centos7初上手1-安装mysql数据库

    随着云服务器的普及,购入云服务器的门槛越来越低,对一个程序员来说,很多人会购买一款云服务器.以前买过两年windows服务器(没有什么实际用途,就是为了玩),最近有机会接触一下linux服务器,选择了 ...

  5. Ubuntu每次启动都显示System program problem detected

    执行命令:sudo gedit /etc/default/apport 将enabled=1改为enabled=0保存退出

  6. Linux集群架构(二)

    Linux集群架构(二) 目录 八.LVS DR模式搭建 九.keepalived + LVS 十.扩展 八.LVS DR模式搭建 1.实验环境: 四台机器: client: 10.0.1.50 Di ...

  7. LINQ Expresstion Tree 表达式树

    Expression trees represent code in a tree-like data structure, where each node is an expression, for ...

  8. find命令配合sed命令使用

    1.查找当前目录下所有以txt文件中包含123的数字都替换成5678 find ./ -name "*.txt" -exec  grep "123" {} \; ...

  9. ef 增加或者更新的习惯思维

    首先申明是我的习惯思维,经常这样写: var item=db.tableName.FirstOrDefault(ii=>....); if(item==null) { item=new ...; ...

  10. list练习

    usernames = ['cwl','pn','gxn','hyp']passwords = ['123456','abc123','324234','23423']#pn#sdfsdf #需要校验 ...