我的Java开发学习之旅------>System.nanoTime与System.currentTimeMillis的区别

简介: 首先来看一道题:下面代码的输出结果是什么? import java.util.HashMap;import java.util.Map;public class HashMapTest { public static void main(String[] args) { Map map=new HashMap(); map.

首先来看一道题:下面代码的输出结果是什么?
import java.util.HashMap;
import java.util.Map;

public class HashMapTest {
	public static void main(String[] args) {
		Map<String, String> map=new HashMap<String, String>();
		map.put(String.valueOf(System.currentTimeMillis())+"a", "1");
		map.put(String.valueOf(System.currentTimeMillis())+"a", "2");
		map.put(String.valueOf(System.currentTimeMillis())+"a", "3");
		for (Map.Entry<String, String> entry : map.entrySet()) {
			System.out.println(entry.getValue());
		}
	}
}

A.  123 B.213 C.123顺序无法确定D.以上答案都不对

我选的答案是C.123顺序无法确定,对程序的理解为:Map中的键是Set,值是Collection,map.entrySet()产生的类型是Set,因而能用foreach(),而Set顺序是随机的,因此输出的1、2、3的顺序不确定。
但是当我把程序在Eclipse上运行后,输出结果却是为:3。
结果亮瞎了我的双眼,原来是现在的计算机运行速度很快,因而极有可能System.currentTimeMillis()的值相等,而Set是不允许有重复的,这样就会覆盖它的值,因此在电脑上厕所时只输出3。

如果想达到期待的输出结果:123顺序无法确定的话。可以将System.currentTimeMillis()改为System.nanoTime()。
  1纳秒=1000  皮秒 
 
  1纳秒 =0.001  微秒
 
  1纳秒=0.000001 毫秒
 

  1纳秒=0.00000 0001


改后代码如下:
import java.util.HashMap;
import java.util.Map;

public class HashMapTest {
	public static void main(String[] args) {
		Map<String, String> map=new HashMap<String, String>();
		map.put(String.valueOf(System.nanoTime())+"a", "1");
		map.put(String.valueOf(System.nanoTime())+"a", "2");
		map.put(String.valueOf(System.nanoTime())+"a", "3");
		for (Map.Entry<String, String> entry : map.entrySet()) {
			System.out.println(entry.getValue());
		}
	}
}

这样输出的结果就是123顺序无法确定了。有可能是213,231,123。。。

=================================================================
下面是中文官方文档上的解释:

currentTimeMillis

public static long currentTimeMillis()
返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

请参阅 Date 类的描述,了解可能发生在“计算机时间”和协调世界时(UTC)之间的细微差异的讨论。

返回:
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。

nanoTime

public static long nanoTime()
返回最准确的可用系统计时器的当前值,以毫微秒为单位。

此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。此方法提供毫微秒的精度,但不是必要的毫微秒的准确度。它对于值的更改频率没有作出保证。在取值范围大于约 292 年(263 毫微秒)的连续调用的不同点在于:由于数字溢出,将无法准确计算已过的时间。

例如,测试某些代码执行的时间长度:

   long startTime = System.nanoTime();
   // ... the code being measured ...
   long estimatedTime = System.nanoTime() - startTime;
 

返回:
系统计时器的当前值,以毫微秒为单位。

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================


相关文章
|
3天前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
22 2
|
3天前
|
安全 Java 编译器
Java基础学习day06
本节学习Java继承与多态核心概念:继承通过extends实现,子类可复用父类非私有成员,支持单继承与多层继承,遵循就近原则并可用super调用父类成员;方法重写需满足权限与返回值约束,常用于重写toString等。多态基于继承,实现父类引用指向子类对象,提升扩展性但无法直接访问子类独有方法,可通过instanceof安全类型转换。
47 2
|
4天前
|
存储 Java
Java基础学习day05
本节介绍Java面向对象编程基础,涵盖类与对象的概念、构造器、this关键字、封装、Javabean及static修饰符的使用。重点讲解如何通过类设计对象、实现数据封装与方法暴露,并理解静态成员的特点与应用场景。
28 2
|
4天前
|
Java
Java基础学习day04-作业
本作业包含8个Java编程案例,涵盖数组的定义与遍历、求和、最值计算、去极值求平均、元素倍增、二维数组行和计算及查找指定元素等内容,旨在巩固Java基础语法与数组操作技能。
44 1
|
6天前
|
存储 Java 索引
Java基础学习day04
本节讲解Java数组基础,包括静态与动态初始化、元素访问及遍历方法,并介绍二维数组的定义与使用,帮助理解程序数据存储方式。
31 5
|
6天前
|
算法 Java
Java基础学习day03-作业
本内容包含多个Java编程案例,涵盖条件判断、循环、数组、随机数生成、素数判断等基础算法练习,适用于巩固Java语法与逻辑思维训练。
54 6
|
6天前
|
Java
Java基础学习day02-作业
本内容包含13个Java编程练习需求,涵盖变量定义、数据类型转换、运算符使用、键盘输入及条件判断等基础语法实践,适合初学者巩固Java核心基础知识。
24 5
|
6天前
|
Java
Java基础学习day01-作业
通过多个Java编程案例,学习变量定义、数据类型使用及控制台输出。涵盖字符串、数值、布尔值等字面量输出,变量赋值与修改,以及实际应用场景如学生信息和商品价格变化的模拟,夯实基础语法掌握。
20 0
|
6天前
|
Java
Java基础学习day03
本节讲解Java流程控制,涵盖分支结构(if、switch)与循环结构(for、while、do-while),介绍其语法、执行流程及应用场景,并解析break、continue用法与循环嵌套,助力掌握程序逻辑控制核心。
29 0
|
7天前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。